diff --git a/.eslintrc.js b/.eslintrc.js index a63845e..76dfadb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,7 +9,13 @@ module.exports = { 'prettier', ], plugins: ['@typescript-eslint'], - ignorePatterns: ['node_modules', '/target', '/dist/**/*', 'src/lib/**/*'], + ignorePatterns: [ + 'node_modules', + '/target', + '/dist/**/*', + 'src/lib/**/*', + 'npm/wasm32-wasi/runtime.js', + ], env: { node: true, }, diff --git a/src/lib/runtime.js b/npm/wasm32-wasi/runtime.js similarity index 74% rename from src/lib/runtime.js rename to npm/wasm32-wasi/runtime.js index 487cc22..e4f42f3 100644 --- a/src/lib/runtime.js +++ b/npm/wasm32-wasi/runtime.js @@ -1,938 +1,1019 @@ /* eslint-disable no-undef */ -var _WebAssembly$1 = typeof WebAssembly !== 'undefined' +var _WebAssembly$1 = + typeof WebAssembly !== 'undefined' ? WebAssembly : typeof WXWebAssembly !== 'undefined' - ? WXWebAssembly - : undefined; + ? WXWebAssembly + : undefined; function validateImports(imports) { - if (imports && typeof imports !== 'object') { - throw new TypeError('imports must be an object or undefined'); - } - return true; + if (imports && typeof imports !== 'object') { + throw new TypeError('imports must be an object or undefined'); + } + return true; } function load(wasmInput, imports) { - if (!wasmInput) - throw new TypeError('Invalid wasm source'); - validateImports(imports); - imports = imports !== null && imports !== void 0 ? imports : {}; - // Promise - try { - var then = typeof wasmInput === 'object' && wasmInput !== null && 'then' in wasmInput ? wasmInput.then : undefined; - if (typeof then === 'function') { - return then.call(wasmInput, function (input) { return load(input, imports); }); - } - } - catch (_) { } - // BufferSource - if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) { - return _WebAssembly$1.instantiate(wasmInput, imports); + if (!wasmInput) throw new TypeError('Invalid wasm source'); + validateImports(imports); + imports = imports !== null && imports !== void 0 ? imports : {}; + // Promise + try { + var then = + typeof wasmInput === 'object' && wasmInput !== null && 'then' in wasmInput + ? wasmInput.then + : undefined; + if (typeof then === 'function') { + return then.call(wasmInput, function (input) { + return load(input, imports); + }); } - // WebAssembly.Module - if (wasmInput instanceof _WebAssembly$1.Module) { - return _WebAssembly$1.instantiate(wasmInput, imports).then(function (instance) { - return { instance: instance, module: wasmInput }; - }); + } catch (_) {} + // BufferSource + if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) { + return _WebAssembly$1.instantiate(wasmInput, imports); + } + // WebAssembly.Module + if (wasmInput instanceof _WebAssembly$1.Module) { + return _WebAssembly$1 + .instantiate(wasmInput, imports) + .then(function (instance) { + return { instance: instance, module: wasmInput }; + }); + } + // Response + if (typeof Response !== 'undefined' && wasmInput instanceof Response) { + return wasmInput.arrayBuffer().then(function (buffer) { + return _WebAssembly$1.instantiate(buffer, imports); + }); + } + // string | URL + var inputIsString = typeof wasmInput === 'string'; + if ( + inputIsString || + (typeof URL !== 'undefined' && wasmInput instanceof URL) + ) { + if ( + inputIsString && + typeof wx !== 'undefined' && + typeof __wxConfig !== 'undefined' + ) { + return _WebAssembly$1.instantiate(wasmInput, imports); } - // Response - if (typeof Response !== 'undefined' && wasmInput instanceof Response) { - return wasmInput.arrayBuffer().then(function (buffer) { - return _WebAssembly$1.instantiate(buffer, imports); - }); + if (typeof fetch !== 'function') { + throw new TypeError( + 'wasm source can not be a string or URL in this environment', + ); } - // string | URL - var inputIsString = typeof wasmInput === 'string'; - if (inputIsString || (typeof URL !== 'undefined' && wasmInput instanceof URL)) { - if (inputIsString && typeof wx !== 'undefined' && typeof __wxConfig !== 'undefined') { - return _WebAssembly$1.instantiate(wasmInput, imports); - } - if (typeof fetch !== 'function') { - throw new TypeError('wasm source can not be a string or URL in this environment'); - } - if (typeof _WebAssembly$1.instantiateStreaming === 'function') { - try { - return _WebAssembly$1.instantiateStreaming(fetch(wasmInput), imports).catch(function () { - return load(fetch(wasmInput), imports); - }); - } - catch (_) { - return load(fetch(wasmInput), imports); - } - } - else { + if (typeof _WebAssembly$1.instantiateStreaming === 'function') { + try { + return _WebAssembly$1 + .instantiateStreaming(fetch(wasmInput), imports) + .catch(function () { return load(fetch(wasmInput), imports); - } + }); + } catch (_) { + return load(fetch(wasmInput), imports); + } + } else { + return load(fetch(wasmInput), imports); } - throw new TypeError('Invalid wasm source'); + } + throw new TypeError('Invalid wasm source'); } function loadSync(wasmInput, imports) { - if (!wasmInput) - throw new TypeError('Invalid wasm source'); - validateImports(imports); - imports = imports !== null && imports !== void 0 ? imports : {}; - var module; - if ((wasmInput instanceof ArrayBuffer) || ArrayBuffer.isView(wasmInput)) { - module = new _WebAssembly$1.Module(wasmInput); - } - else if (wasmInput instanceof WebAssembly.Module) { - module = wasmInput; - } - else { - throw new TypeError('Invalid wasm source'); - } - var instance = new _WebAssembly$1.Instance(module, imports); - var source = { instance: instance, module: module }; - return source; + if (!wasmInput) throw new TypeError('Invalid wasm source'); + validateImports(imports); + imports = imports !== null && imports !== void 0 ? imports : {}; + var module; + if (wasmInput instanceof ArrayBuffer || ArrayBuffer.isView(wasmInput)) { + module = new _WebAssembly$1.Module(wasmInput); + } else if (wasmInput instanceof WebAssembly.Module) { + module = wasmInput; + } else { + throw new TypeError('Invalid wasm source'); + } + var instance = new _WebAssembly$1.Instance(module, imports); + var source = { instance: instance, module: module }; + return source; } function createNapiModule(options) { - var napiModule = (function () { - var ENVIRONMENT_IS_NODE = null !== null; - var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread); - var reuseWorker = Boolean(options.reuseWorker); - var wasmInstance; - var wasmModule; - var wasmMemory; - var wasmTable; - var _malloc; - var _free; - function abort(msg) { - if (typeof _WebAssembly$1.RuntimeError === 'function') { - throw new _WebAssembly$1.RuntimeError(msg); - } - throw Error(msg); - } - var napiModule = { - imports: { - env: {}, - napi: {}, - emnapi: {} - }, - exports: {}, - emnapi: {}, - loaded: false, - filename: '', - childThread: Boolean(options.childThread), - spawnThread: undefined, - startThread: undefined, - initWorker: undefined, - executeAsyncWork: undefined, - init: function (options) { - if (napiModule.loaded) - return napiModule.exports; - if (!options) - throw new TypeError('Invalid napi init options'); - var instance = options.instance; - if (!(instance === null || instance === void 0 ? void 0 : instance.exports)) - throw new TypeError('Invalid wasm instance'); - wasmInstance = instance; - var exports = instance.exports; - var module = options.module; - var memory = options.memory || exports.memory; - var table = options.table || exports.__indirect_function_table; - if (!(module instanceof _WebAssembly$1.Module)) - throw new TypeError('Invalid wasm module'); - if (!(memory instanceof _WebAssembly$1.Memory)) - throw new TypeError('Invalid wasm memory'); - if (!(table instanceof _WebAssembly$1.Table)) - throw new TypeError('Invalid wasm table'); - wasmModule = module; - wasmMemory = memory; - wasmTable = table; - if (typeof exports.malloc !== 'function') - throw new TypeError('malloc is not exported'); - if (typeof exports.free !== 'function') - throw new TypeError('free is not exported'); - _malloc = exports.malloc; - _free = exports.free; - if (!napiModule.childThread) { - // main thread only - var moduleApiVersion = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */; - var node_api_module_get_api_version_v1 = instance.exports.node_api_module_get_api_version_v1; - if (typeof node_api_module_get_api_version_v1 === 'function') { - moduleApiVersion = node_api_module_get_api_version_v1(); - } - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - var envObject = napiModule.envObject || (napiModule.envObject = emnapiCtx.createEnv(napiModule.filename, moduleApiVersion, function (cb) { return (wasmTable.get(cb)); }, function (cb) { return (wasmTable.get(cb)); }, abort, emnapiNodeBinding)); - var scope_1 = emnapiCtx.openScope(envObject); - try { - envObject.callIntoModule(function (_envObject) { - var exports = napiModule.exports; - var exportsHandle = scope_1.add(exports); - var napi_register_wasm_v1 = instance.exports.napi_register_wasm_v1; - var napiValue = napi_register_wasm_v1(_envObject.id, exportsHandle.id); - napiModule.exports = (!napiValue) ? exports : emnapiCtx.handleStore.get(napiValue).value; - }); - } - finally { - emnapiCtx.closeScope(envObject, scope_1); - } - napiModule.loaded = true; - delete napiModule.envObject; - return napiModule.exports; - } - } - }; - var emnapiCtx; - var emnapiNodeBinding; - var onCreateWorker; - var err; - if (!ENVIRONMENT_IS_PTHREAD) { - var context = options.context; - if (typeof context !== 'object' || context === null) { - throw new TypeError("Invalid `options.context`. Use `import { getDefaultContext } from '@emnapi/runtime'`"); - } - emnapiCtx = context; - } - else { - emnapiCtx = options === null || options === void 0 ? void 0 : options.context; - var postMsg = typeof options.postMessage === 'function' - ? options.postMessage - : typeof postMessage === 'function' - ? postMessage - : undefined; - if (typeof postMsg !== 'function') { - throw new TypeError('No postMessage found'); - } - napiModule.postMessage = postMsg; - } - if (typeof options.filename === 'string') { - napiModule.filename = options.filename; - } - if (typeof options.onCreateWorker === 'function') { - onCreateWorker = options.onCreateWorker; - } - if (typeof options.print === 'function') { - options.print; - } - else { - console.log.bind(console); - } - if (typeof options.printErr === 'function') { - err = options.printErr; - } - else { - err = console.warn.bind(console); - } - if ('nodeBinding' in options) { - var nodeBinding = options.nodeBinding; - if (typeof nodeBinding !== 'object' || nodeBinding === null) { - throw new TypeError('Invalid `options.nodeBinding`. Use @emnapi/node-binding package'); - } - emnapiNodeBinding = nodeBinding; - } - var emnapiAsyncWorkPoolSize = 0; - if ('asyncWorkPoolSize' in options) { - if (typeof options.asyncWorkPoolSize !== 'number') { - throw new TypeError('options.asyncWorkPoolSize must be a integer'); - } - emnapiAsyncWorkPoolSize = options.asyncWorkPoolSize >> 0; - if (emnapiAsyncWorkPoolSize > 1024) { - emnapiAsyncWorkPoolSize = 1024; - } - else if (emnapiAsyncWorkPoolSize < -1024) { - emnapiAsyncWorkPoolSize = -1024; - } - } - var singleThreadAsyncWork = ENVIRONMENT_IS_PTHREAD ? false : (emnapiAsyncWorkPoolSize <= 0); - function _emnapi_async_work_pool_size() { - return Math.abs(emnapiAsyncWorkPoolSize); - } - napiModule.imports.env._emnapi_async_work_pool_size = _emnapi_async_work_pool_size; - // ------------------------------ pthread ------------------------------- - function emnapiAddSendListener(worker) { - if (!worker) - return false; - if (worker._emnapiSendListener) - return true; - var handler = function (e) { - var data = e.data; - var __emnapi__ = data.__emnapi__; - if (__emnapi__ && __emnapi__.type === 'async-send') { - if (ENVIRONMENT_IS_PTHREAD) { - var postMessage_1 = napiModule.postMessage; - postMessage_1({ __emnapi__: __emnapi__ }); - } - else { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var callback = __emnapi__.payload.callback; - (wasmTable.get(callback))(__emnapi__.payload.data); - } - } - }; - var dispose = function () { - { - worker.removeEventListener('message', handler, false); - } - delete worker._emnapiSendListener; - }; - worker._emnapiSendListener = { handler: handler, dispose: dispose }; - { - worker.addEventListener('message', handler, false); - } - return true; - } - napiModule.emnapi.addSendListener = emnapiAddSendListener; - function terminateWorker(worker) { - var tid = worker.__emnapi_tid; - worker.terminate(); - worker.onmessage = function (e) { - if (e.data.__emnapi__) { - err('received "' + e.data.__emnapi__.type + '" command from terminated worker: ' + tid); - } - }; - } - function spawnThread(startArg, errorOrTid) { - var isNewABI = errorOrTid !== undefined; - if (!isNewABI) { - errorOrTid = _malloc(8); - if (!errorOrTid) { - return -48; /* ENOMEM */ - } - } - var struct = new Int32Array(wasmMemory.buffer, errorOrTid, 2); - Atomics.store(struct, 0, 0); - Atomics.store(struct, 1, 0); - if (ENVIRONMENT_IS_PTHREAD) { - var postMessage_2 = napiModule.postMessage; - postMessage_2({ - __emnapi__: { - type: 'spawn-thread', - payload: { - startArg: startArg, - errorOrTid: errorOrTid - } - } - }); - Atomics.wait(struct, 1, 0); - var isError = Atomics.load(struct, 0); - var result = Atomics.load(struct, 1); - if (isNewABI) { - return isError; - } - _free(errorOrTid); - return isError ? -result : result; - } - var worker; - try { - worker = PThread.getNewWorker(); - if (!worker) { - throw new Error('failed to get new worker'); - } - } - catch (e) { - var EAGAIN = 6; - Atomics.store(struct, 0, 1); - Atomics.store(struct, 1, EAGAIN); - Atomics.notify(struct, 1); - err(e.message); - if (isNewABI) { - return 1; - } - _free(errorOrTid); - return -EAGAIN; - } - var tid = PThread.nextWorkerID + 43; - Atomics.store(struct, 0, 0); - Atomics.store(struct, 1, tid); - Atomics.notify(struct, 1); - var WASI_THREADS_MAX_TID = 0x1FFFFFFF; - PThread.nextWorkerID = (PThread.nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42); - PThread.pthreads[tid] = worker; - worker.__emnapi_tid = tid; - PThread.runningWorkers.push(worker); - worker.postMessage({ - __emnapi__: { - type: 'start', - payload: { - tid: tid, - arg: startArg - } - } + var napiModule = (function () { + var ENVIRONMENT_IS_NODE = null !== null; + var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread); + var reuseWorker = Boolean(options.reuseWorker); + var wasmInstance; + var wasmModule; + var wasmMemory; + var wasmTable; + var _malloc; + var _free; + function abort(msg) { + if (typeof _WebAssembly$1.RuntimeError === 'function') { + throw new _WebAssembly$1.RuntimeError(msg); + } + throw Error(msg); + } + var napiModule = { + imports: { + env: {}, + napi: {}, + emnapi: {}, + }, + exports: {}, + emnapi: {}, + loaded: false, + filename: '', + childThread: Boolean(options.childThread), + spawnThread: undefined, + startThread: undefined, + initWorker: undefined, + executeAsyncWork: undefined, + init: function (options) { + if (napiModule.loaded) return napiModule.exports; + if (!options) throw new TypeError('Invalid napi init options'); + var instance = options.instance; + if ( + !(instance === null || instance === void 0 + ? void 0 + : instance.exports) + ) + throw new TypeError('Invalid wasm instance'); + wasmInstance = instance; + var exports = instance.exports; + var module = options.module; + var memory = options.memory || exports.memory; + var table = options.table || exports.__indirect_function_table; + if (!(module instanceof _WebAssembly$1.Module)) + throw new TypeError('Invalid wasm module'); + if (!(memory instanceof _WebAssembly$1.Memory)) + throw new TypeError('Invalid wasm memory'); + if (!(table instanceof _WebAssembly$1.Table)) + throw new TypeError('Invalid wasm table'); + wasmModule = module; + wasmMemory = memory; + wasmTable = table; + if (typeof exports.malloc !== 'function') + throw new TypeError('malloc is not exported'); + if (typeof exports.free !== 'function') + throw new TypeError('free is not exported'); + _malloc = exports.malloc; + _free = exports.free; + if (!napiModule.childThread) { + // main thread only + var moduleApiVersion = 8; /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */ + var node_api_module_get_api_version_v1 = + instance.exports.node_api_module_get_api_version_v1; + if (typeof node_api_module_get_api_version_v1 === 'function') { + moduleApiVersion = node_api_module_get_api_version_v1(); + } + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + var envObject = + napiModule.envObject || + (napiModule.envObject = emnapiCtx.createEnv( + napiModule.filename, + moduleApiVersion, + function (cb) { + return wasmTable.get(cb); + }, + function (cb) { + return wasmTable.get(cb); + }, + abort, + emnapiNodeBinding, + )); + var scope_1 = emnapiCtx.openScope(envObject); + try { + envObject.callIntoModule(function (_envObject) { + var exports = napiModule.exports; + var exportsHandle = scope_1.add(exports); + var napi_register_wasm_v1 = + instance.exports.napi_register_wasm_v1; + var napiValue = napi_register_wasm_v1( + _envObject.id, + exportsHandle.id, + ); + napiModule.exports = !napiValue + ? exports + : emnapiCtx.handleStore.get(napiValue).value; }); - if (isNewABI) { - return 0; - } - _free(errorOrTid); - return tid; - } - function startThread(tid, startArg) { - if (napiModule.childThread) { - if (typeof wasmInstance.exports.wasi_thread_start !== 'function') { - throw new TypeError('wasi_thread_start is not exported'); - } - var postMessage_3 = napiModule.postMessage; - wasmInstance.exports.wasi_thread_start(tid, startArg); - postMessage_3({ - __emnapi__: { - type: 'cleanup-thread', - payload: { - tid: tid - } - } - }); - } - else { - throw new Error('startThread is only available in child threads'); - } + } finally { + emnapiCtx.closeScope(envObject, scope_1); + } + napiModule.loaded = true; + delete napiModule.envObject; + return napiModule.exports; + } + }, + }; + var emnapiCtx; + var emnapiNodeBinding; + var onCreateWorker; + var err; + if (!ENVIRONMENT_IS_PTHREAD) { + var context = options.context; + if (typeof context !== 'object' || context === null) { + throw new TypeError( + "Invalid `options.context`. Use `import { getDefaultContext } from '@emnapi/runtime'`", + ); + } + emnapiCtx = context; + } else { + emnapiCtx = + options === null || options === void 0 ? void 0 : options.context; + var postMsg = + typeof options.postMessage === 'function' + ? options.postMessage + : typeof postMessage === 'function' + ? postMessage + : undefined; + if (typeof postMsg !== 'function') { + throw new TypeError('No postMessage found'); + } + napiModule.postMessage = postMsg; + } + if (typeof options.filename === 'string') { + napiModule.filename = options.filename; + } + if (typeof options.onCreateWorker === 'function') { + onCreateWorker = options.onCreateWorker; + } + if (typeof options.print === 'function') { + options.print; + } else { + console.log.bind(console); + } + if (typeof options.printErr === 'function') { + err = options.printErr; + } else { + err = console.warn.bind(console); + } + if ('nodeBinding' in options) { + var nodeBinding = options.nodeBinding; + if (typeof nodeBinding !== 'object' || nodeBinding === null) { + throw new TypeError( + 'Invalid `options.nodeBinding`. Use @emnapi/node-binding package', + ); + } + emnapiNodeBinding = nodeBinding; + } + var emnapiAsyncWorkPoolSize = 0; + if ('asyncWorkPoolSize' in options) { + if (typeof options.asyncWorkPoolSize !== 'number') { + throw new TypeError('options.asyncWorkPoolSize must be a integer'); + } + emnapiAsyncWorkPoolSize = options.asyncWorkPoolSize >> 0; + if (emnapiAsyncWorkPoolSize > 1024) { + emnapiAsyncWorkPoolSize = 1024; + } else if (emnapiAsyncWorkPoolSize < -1024) { + emnapiAsyncWorkPoolSize = -1024; + } + } + var singleThreadAsyncWork = ENVIRONMENT_IS_PTHREAD + ? false + : emnapiAsyncWorkPoolSize <= 0; + function _emnapi_async_work_pool_size() { + return Math.abs(emnapiAsyncWorkPoolSize); + } + napiModule.imports.env._emnapi_async_work_pool_size = + _emnapi_async_work_pool_size; + // ------------------------------ pthread ------------------------------- + function emnapiAddSendListener(worker) { + if (!worker) return false; + if (worker._emnapiSendListener) return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__ && __emnapi__.type === 'async-send') { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ __emnapi__: __emnapi__ }); + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var callback = __emnapi__.payload.callback; + wasmTable.get(callback)(__emnapi__.payload.data); + } } - napiModule.spawnThread = spawnThread; - napiModule.startThread = startThread; - var PThread = { - unusedWorkers: [], - runningWorkers: [], - pthreads: Object.create(null), - nextWorkerID: 0, - init: function () { }, - returnWorkerToPool: function (worker) { - var tid = worker.__emnapi_tid; - delete PThread.pthreads[tid]; - PThread.unusedWorkers.push(worker); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); - delete worker.__emnapi_tid; - }, - loadWasmModuleToWorker: function (worker) { - if (worker.whenLoaded) - return worker.whenLoaded; - worker.whenLoaded = new Promise(function (resolve, reject) { - worker.onmessage = function (e) { - if (e.data.__emnapi__) { - var type = e.data.__emnapi__.type; - var payload = e.data.__emnapi__.payload; - if (type === 'loaded') { - worker.loaded = true; - resolve(worker); - // if (payload.err) { - // err('failed to load in child thread: ' + (payload.err.message || payload.err)) - // } - } - else if (type === 'spawn-thread') { - spawnThread(payload.startArg, payload.errorOrTid); - } - else if (type === 'cleanup-thread') { - if (reuseWorker) { - PThread.returnWorkerToPool(worker); - } - else { - delete PThread.pthreads[payload.tid]; - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); - terminateWorker(worker); - delete worker.__emnapi_tid; - } - } - } - }; - worker.onerror = function (e) { - var message = 'worker sent an error!'; - // if (worker.pthread_ptr) { - // message = 'Pthread ' + ptrToString(worker.pthread_ptr) + ' sent an error!' - // } - err(message + ' ' + e.message); - reject(e); - throw e; - }; - // napiModule.emnapi.addSendListener(worker) - emnapiAddSendListener(worker); - // if (typeof emnapiTSFN !== 'undefined') { - // emnapiTSFN.addListener(worker) - // } - try { - worker.postMessage({ - __emnapi__: { - type: 'load', - payload: { - wasmModule: wasmModule, - wasmMemory: wasmMemory - } - } - }); - } - catch (err) { - if (typeof SharedArrayBuffer === 'undefined' || !(wasmMemory.buffer instanceof SharedArrayBuffer)) { - throw new Error('Multithread features require shared wasm memory. ' + - 'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking'); - } - throw err; - } - }); - return worker.whenLoaded; + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiSendListener; + }; + worker._emnapiSendListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); + } + return true; + } + napiModule.emnapi.addSendListener = emnapiAddSendListener; + function terminateWorker(worker) { + var tid = worker.__emnapi_tid; + worker.terminate(); + worker.onmessage = function (e) { + if (e.data.__emnapi__) { + err( + 'received "' + + e.data.__emnapi__.type + + '" command from terminated worker: ' + + tid, + ); + } + }; + } + function spawnThread(startArg, errorOrTid) { + var isNewABI = errorOrTid !== undefined; + if (!isNewABI) { + errorOrTid = _malloc(8); + if (!errorOrTid) { + return -48; /* ENOMEM */ + } + } + var struct = new Int32Array(wasmMemory.buffer, errorOrTid, 2); + Atomics.store(struct, 0, 0); + Atomics.store(struct, 1, 0); + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_2 = napiModule.postMessage; + postMessage_2({ + __emnapi__: { + type: 'spawn-thread', + payload: { + startArg: startArg, + errorOrTid: errorOrTid, }, - allocateUnusedWorker: function () { - if (typeof onCreateWorker !== 'function') { - throw new TypeError('`options.onCreateWorker` is not provided'); - } - var worker = onCreateWorker({ type: 'thread' }); - PThread.unusedWorkers.push(worker); - return worker; + }, + }); + Atomics.wait(struct, 1, 0); + var isError = Atomics.load(struct, 0); + var result = Atomics.load(struct, 1); + if (isNewABI) { + return isError; + } + _free(errorOrTid); + return isError ? -result : result; + } + var worker; + try { + worker = PThread.getNewWorker(); + if (!worker) { + throw new Error('failed to get new worker'); + } + } catch (e) { + var EAGAIN = 6; + Atomics.store(struct, 0, 1); + Atomics.store(struct, 1, EAGAIN); + Atomics.notify(struct, 1); + err(e.message); + if (isNewABI) { + return 1; + } + _free(errorOrTid); + return -EAGAIN; + } + var tid = PThread.nextWorkerID + 43; + Atomics.store(struct, 0, 0); + Atomics.store(struct, 1, tid); + Atomics.notify(struct, 1); + var WASI_THREADS_MAX_TID = 0x1fffffff; + PThread.nextWorkerID = + (PThread.nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42); + PThread.pthreads[tid] = worker; + worker.__emnapi_tid = tid; + PThread.runningWorkers.push(worker); + worker.postMessage({ + __emnapi__: { + type: 'start', + payload: { + tid: tid, + arg: startArg, + }, + }, + }); + if (isNewABI) { + return 0; + } + _free(errorOrTid); + return tid; + } + function startThread(tid, startArg) { + if (napiModule.childThread) { + if (typeof wasmInstance.exports.wasi_thread_start !== 'function') { + throw new TypeError('wasi_thread_start is not exported'); + } + var postMessage_3 = napiModule.postMessage; + wasmInstance.exports.wasi_thread_start(tid, startArg); + postMessage_3({ + __emnapi__: { + type: 'cleanup-thread', + payload: { + tid: tid, }, - getNewWorker: function () { + }, + }); + } else { + throw new Error('startThread is only available in child threads'); + } + } + napiModule.spawnThread = spawnThread; + napiModule.startThread = startThread; + var PThread = { + unusedWorkers: [], + runningWorkers: [], + pthreads: Object.create(null), + nextWorkerID: 0, + init: function () {}, + returnWorkerToPool: function (worker) { + var tid = worker.__emnapi_tid; + delete PThread.pthreads[tid]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice( + PThread.runningWorkers.indexOf(worker), + 1, + ); + delete worker.__emnapi_tid; + }, + loadWasmModuleToWorker: function (worker) { + if (worker.whenLoaded) return worker.whenLoaded; + worker.whenLoaded = new Promise(function (resolve, reject) { + worker.onmessage = function (e) { + if (e.data.__emnapi__) { + var type = e.data.__emnapi__.type; + var payload = e.data.__emnapi__.payload; + if (type === 'loaded') { + worker.loaded = true; + resolve(worker); + // if (payload.err) { + // err('failed to load in child thread: ' + (payload.err.message || payload.err)) + // } + } else if (type === 'spawn-thread') { + spawnThread(payload.startArg, payload.errorOrTid); + } else if (type === 'cleanup-thread') { if (reuseWorker) { - if (PThread.unusedWorkers.length === 0) { - var worker_1 = PThread.allocateUnusedWorker(); - PThread.loadWasmModuleToWorker(worker_1); - } - return PThread.unusedWorkers.pop(); - } - var worker = PThread.allocateUnusedWorker(); - PThread.loadWasmModuleToWorker(worker); - return worker; - } - }; - /** - * @__sig ipiip - */ - function napi_set_last_error(env, error_code, engine_error_code, engine_reserved) { - var envObject = emnapiCtx.envStore.get(env); - return envObject.setLastError(error_code, engine_error_code, engine_reserved); - } - /** - * @__sig ip - */ - function napi_clear_last_error(env) { - var envObject = emnapiCtx.envStore.get(env); - return envObject.clearLastError(); - } - /** - * @__sig vppp - */ - function _emnapi_get_node_version(major, minor, patch) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var versions = [0, 0, 0]; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(major, versions[0], true); - HEAP_DATA_VIEW.setUint32(minor, versions[1], true); - HEAP_DATA_VIEW.setUint32(patch, versions[2], true); - } - /** - * @__sig v - * @__deps $runtimeKeepalivePush - */ - function _emnapi_runtime_keepalive_push() { - } - /** - * @__sig v - * @__deps $runtimeKeepalivePop - */ - function _emnapi_runtime_keepalive_pop() { - } - /** - * @__sig vpp - */ - function _emnapi_set_immediate(callback, data) { - emnapiCtx.feature.setImmediate(function () { - (wasmTable.get(callback))(data); - }); - } - /** - * @__sig vpp - */ - function _emnapi_next_tick(callback, data) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - Promise.resolve().then(function () { - (wasmTable.get(callback))(data); + PThread.returnWorkerToPool(worker); + } else { + delete PThread.pthreads[payload.tid]; + PThread.runningWorkers.splice( + PThread.runningWorkers.indexOf(worker), + 1, + ); + terminateWorker(worker); + delete worker.__emnapi_tid; + } + } + } + }; + worker.onerror = function (e) { + var message = 'worker sent an error!'; + // if (worker.pthread_ptr) { + // message = 'Pthread ' + ptrToString(worker.pthread_ptr) + ' sent an error!' + // } + err(message + ' ' + e.message); + reject(e); + throw e; + }; + // napiModule.emnapi.addSendListener(worker) + emnapiAddSendListener(worker); + // if (typeof emnapiTSFN !== 'undefined') { + // emnapiTSFN.addListener(worker) + // } + try { + worker.postMessage({ + __emnapi__: { + type: 'load', + payload: { + wasmModule: wasmModule, + wasmMemory: wasmMemory, + }, + }, }); - } - /** - * @__sig vipppi - */ - function _emnapi_callback_into_module(forceUncaught, env, callback, data, close_scope_if_throw) { - var envObject = emnapiCtx.envStore.get(env); - var scope = emnapiCtx.openScope(envObject); - try { - envObject.callbackIntoModule(Boolean(forceUncaught), function () { - (wasmTable.get(callback))(env, data); - }); - } - catch (err) { - emnapiCtx.closeScope(envObject, scope); - if (close_scope_if_throw) { - emnapiCtx.closeScope(envObject); - } - throw err; + } catch (err) { + if ( + typeof SharedArrayBuffer === 'undefined' || + !(wasmMemory.buffer instanceof SharedArrayBuffer) + ) { + throw new Error( + 'Multithread features require shared wasm memory. ' + + 'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking', + ); } - emnapiCtx.closeScope(envObject, scope); - } - /** - * @__sig vipppp - */ - function _emnapi_call_finalizer(forceUncaught, env, callback, data, hint) { - var envObject = emnapiCtx.envStore.get(env); - envObject.callFinalizerInternal(forceUncaught, callback, data, hint); - } - /** - * @__sig v - */ - function _emnapi_ctx_increase_waiting_request_counter() { - emnapiCtx.increaseWaitingRequestCounter(); - } - /** - * @__sig v - */ - function _emnapi_ctx_decrease_waiting_request_counter() { - emnapiCtx.decreaseWaitingRequestCounter(); - } - function $emnapiSetValueI64(result, numberValue) { - var tempDouble; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var tempI64 = [ - numberValue >>> 0, - (tempDouble = numberValue, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0) - ]; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, tempI64[0], true); - HEAP_DATA_VIEW.setInt32(result + 4, tempI64[1], true); - } - var utilMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - $emnapiSetValueI64: $emnapiSetValueI64, - _emnapi_call_finalizer: _emnapi_call_finalizer, - _emnapi_callback_into_module: _emnapi_callback_into_module, - _emnapi_ctx_decrease_waiting_request_counter: _emnapi_ctx_decrease_waiting_request_counter, - _emnapi_ctx_increase_waiting_request_counter: _emnapi_ctx_increase_waiting_request_counter, - _emnapi_get_node_version: _emnapi_get_node_version, - _emnapi_next_tick: _emnapi_next_tick, - _emnapi_runtime_keepalive_pop: _emnapi_runtime_keepalive_pop, - _emnapi_runtime_keepalive_push: _emnapi_runtime_keepalive_push, - _emnapi_set_immediate: _emnapi_set_immediate, - napi_clear_last_error: napi_clear_last_error, - napi_set_last_error: napi_set_last_error + throw err; + } }); - function emnapiGetWorkerByPthreadPtr(pthreadPtr) { - var view = new DataView(wasmMemory.buffer); - /** - * wasi-sdk-20.0+threads - * - * struct pthread { - * struct pthread *self; // 0 - * struct pthread *prev, *next; // 4, 8 - * uintptr_t sysinfo; // 12 - * uintptr_t canary; // 16 - * int tid; // 20 - * // ... - * } - */ - var tidOffset = 20; - var tid = view.getInt32(pthreadPtr + tidOffset, true); - var worker = PThread.pthreads[tid]; - return worker; - } - /** @__sig vp */ - function _emnapi_worker_unref(pthreadPtr) { - if (ENVIRONMENT_IS_PTHREAD) - return; - var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); - if (worker && typeof worker.unref === 'function') { - worker.unref(); - } - } - /** @__sig vipp */ - function _emnapi_async_send_js(type, callback, data) { - if (ENVIRONMENT_IS_PTHREAD) { - var postMessage_1 = napiModule.postMessage; - postMessage_1({ - __emnapi__: { - type: 'async-send', - payload: { - callback: callback, - data: data - } - } - }); - } - else { - switch (type) { - case 0: - _emnapi_set_immediate(callback, data); - break; - case 1: - _emnapi_next_tick(callback, data); - break; - } - } - } - // function ptrToString (ptr: number): string { - // return '0x' + ('00000000' + ptr.toString(16)).slice(-8) - // } - var uvThreadpoolReadyResolve; - var uvThreadpoolReady = new Promise(function (resolve) { - uvThreadpoolReadyResolve = function () { - uvThreadpoolReady.ready = true; - resolve(); - }; + return worker.whenLoaded; + }, + allocateUnusedWorker: function () { + if (typeof onCreateWorker !== 'function') { + throw new TypeError('`options.onCreateWorker` is not provided'); + } + var worker = onCreateWorker({ type: 'thread' }); + PThread.unusedWorkers.push(worker); + return worker; + }, + getNewWorker: function () { + if (reuseWorker) { + if (PThread.unusedWorkers.length === 0) { + var worker_1 = PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(worker_1); + } + return PThread.unusedWorkers.pop(); + } + var worker = PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(worker); + return worker; + }, + }; + /** + * @__sig ipiip + */ + function napi_set_last_error( + env, + error_code, + engine_error_code, + engine_reserved, + ) { + var envObject = emnapiCtx.envStore.get(env); + return envObject.setLastError( + error_code, + engine_error_code, + engine_reserved, + ); + } + /** + * @__sig ip + */ + function napi_clear_last_error(env) { + var envObject = emnapiCtx.envStore.get(env); + return envObject.clearLastError(); + } + /** + * @__sig vppp + */ + function _emnapi_get_node_version(major, minor, patch) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var versions = [0, 0, 0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(major, versions[0], true); + HEAP_DATA_VIEW.setUint32(minor, versions[1], true); + HEAP_DATA_VIEW.setUint32(patch, versions[2], true); + } + /** + * @__sig v + * @__deps $runtimeKeepalivePush + */ + function _emnapi_runtime_keepalive_push() {} + /** + * @__sig v + * @__deps $runtimeKeepalivePop + */ + function _emnapi_runtime_keepalive_pop() {} + /** + * @__sig vpp + */ + function _emnapi_set_immediate(callback, data) { + emnapiCtx.feature.setImmediate(function () { + wasmTable.get(callback)(data); + }); + } + /** + * @__sig vpp + */ + function _emnapi_next_tick(callback, data) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + Promise.resolve().then(function () { + wasmTable.get(callback)(data); + }); + } + /** + * @__sig vipppi + */ + function _emnapi_callback_into_module( + forceUncaught, + env, + callback, + data, + close_scope_if_throw, + ) { + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + try { + envObject.callbackIntoModule(Boolean(forceUncaught), function () { + wasmTable.get(callback)(env, data); }); - uvThreadpoolReady.ready = false; - /** @__sig i */ - function _emnapi_is_main_browser_thread() { - return (typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE) ? 1 : 0; - } - /** @__sig vppi */ - function _emnapi_after_uvthreadpool_ready(callback, q, type) { - if (uvThreadpoolReady.ready) { - (wasmTable.get(callback))(q, type); - } - else { - uvThreadpoolReady.then(function () { - (wasmTable.get(callback))(q, type); - }); - } - } - /** @__sig vpi */ - function _emnapi_tell_js_uvthreadpool(threads, size) { - var p = []; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var _loop_1 = function (i) { - var pthreadPtr = HEAP_DATA_VIEW.getInt32(threads + i * 4, true); - var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); - p.push(new Promise(function (resolve) { - var handler = function (e) { - var data = e.data; - var __emnapi__ = data.__emnapi__; - if (__emnapi__ && __emnapi__.type === 'async-thread-ready') { - resolve(); - if (worker && typeof worker.unref === 'function') { - worker.unref(); - } - { - worker.removeEventListener('message', handler); - } - } - }; - { - worker.addEventListener('message', handler); - } - })); - }; - for (var i = 0; i < size; i++) { - _loop_1(i); - } - Promise.all(p).then(uvThreadpoolReadyResolve); - } - /** @__sig v */ - function _emnapi_emit_async_thread_ready() { - if (!ENVIRONMENT_IS_PTHREAD) - return; - var postMessage = napiModule.postMessage; - postMessage({ - __emnapi__: { - type: 'async-thread-ready', - payload: {} - } - }); - } - var asyncMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - _emnapi_after_uvthreadpool_ready: _emnapi_after_uvthreadpool_ready, - _emnapi_async_send_js: _emnapi_async_send_js, - _emnapi_emit_async_thread_ready: _emnapi_emit_async_thread_ready, - _emnapi_is_main_browser_thread: _emnapi_is_main_browser_thread, - _emnapi_tell_js_uvthreadpool: _emnapi_tell_js_uvthreadpool, - _emnapi_worker_unref: _emnapi_worker_unref + } catch (err) { + emnapiCtx.closeScope(envObject, scope); + if (close_scope_if_throw) { + emnapiCtx.closeScope(envObject); + } + throw err; + } + emnapiCtx.closeScope(envObject, scope); + } + /** + * @__sig vipppp + */ + function _emnapi_call_finalizer(forceUncaught, env, callback, data, hint) { + var envObject = emnapiCtx.envStore.get(env); + envObject.callFinalizerInternal(forceUncaught, callback, data, hint); + } + /** + * @__sig v + */ + function _emnapi_ctx_increase_waiting_request_counter() { + emnapiCtx.increaseWaitingRequestCounter(); + } + /** + * @__sig v + */ + function _emnapi_ctx_decrease_waiting_request_counter() { + emnapiCtx.decreaseWaitingRequestCounter(); + } + function $emnapiSetValueI64(result, numberValue) { + var tempDouble; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var tempI64 = [ + numberValue >>> 0, + ((tempDouble = numberValue), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | + 0) >>> + 0 + : ~~+Math.ceil( + (tempDouble - +(~~tempDouble >>> 0)) / 4294967296, + ) >>> 0 + : 0), + ]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, tempI64[0], true); + HEAP_DATA_VIEW.setInt32(result + 4, tempI64[1], true); + } + var utilMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + $emnapiSetValueI64: $emnapiSetValueI64, + _emnapi_call_finalizer: _emnapi_call_finalizer, + _emnapi_callback_into_module: _emnapi_callback_into_module, + _emnapi_ctx_decrease_waiting_request_counter: + _emnapi_ctx_decrease_waiting_request_counter, + _emnapi_ctx_increase_waiting_request_counter: + _emnapi_ctx_increase_waiting_request_counter, + _emnapi_get_node_version: _emnapi_get_node_version, + _emnapi_next_tick: _emnapi_next_tick, + _emnapi_runtime_keepalive_pop: _emnapi_runtime_keepalive_pop, + _emnapi_runtime_keepalive_push: _emnapi_runtime_keepalive_push, + _emnapi_set_immediate: _emnapi_set_immediate, + napi_clear_last_error: napi_clear_last_error, + napi_set_last_error: napi_set_last_error, + }); + function emnapiGetWorkerByPthreadPtr(pthreadPtr) { + var view = new DataView(wasmMemory.buffer); + /** + * wasi-sdk-20.0+threads + * + * struct pthread { + * struct pthread *self; // 0 + * struct pthread *prev, *next; // 4, 8 + * uintptr_t sysinfo; // 12 + * uintptr_t canary; // 16 + * int tid; // 20 + * // ... + * } + */ + var tidOffset = 20; + var tid = view.getInt32(pthreadPtr + tidOffset, true); + var worker = PThread.pthreads[tid]; + return worker; + } + /** @__sig vp */ + function _emnapi_worker_unref(pthreadPtr) { + if (ENVIRONMENT_IS_PTHREAD) return; + var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); + if (worker && typeof worker.unref === 'function') { + worker.unref(); + } + } + /** @__sig vipp */ + function _emnapi_async_send_js(type, callback, data) { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ + __emnapi__: { + type: 'async-send', + payload: { + callback: callback, + data: data, + }, + }, }); - /* eslint-disable @typescript-eslint/indent */ - /** @__sig ipjp */ - function napi_adjust_external_memory(env, change_in_bytes, adjusted_value) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!adjusted_value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var change_in_bytes_number = Number(change_in_bytes); - if (change_in_bytes_number < 0) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var old_size = wasmMemory.buffer.byteLength; - var new_size = old_size + change_in_bytes_number; - new_size = new_size + ((65536 - new_size % 65536) % 65536); - if (wasmMemory.grow((new_size - old_size + 65535) >> 16) === -1) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (emnapiCtx.feature.supportBigInt) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setBigInt64(adjusted_value, BigInt(wasmMemory.buffer.byteLength), true); - } - else { - $emnapiSetValueI64(adjusted_value, wasmMemory.buffer.byteLength); - } - return envObject.clearLastError(); + } else { + switch (type) { + case 0: + _emnapi_set_immediate(callback, data); + break; + case 1: + _emnapi_next_tick(callback, data); + break; } - var memoryMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_adjust_external_memory: napi_adjust_external_memory + } + } + // function ptrToString (ptr: number): string { + // return '0x' + ('00000000' + ptr.toString(16)).slice(-8) + // } + var uvThreadpoolReadyResolve; + var uvThreadpoolReady = new Promise(function (resolve) { + uvThreadpoolReadyResolve = function () { + uvThreadpoolReady.ready = true; + resolve(); + }; + }); + uvThreadpoolReady.ready = false; + /** @__sig i */ + function _emnapi_is_main_browser_thread() { + return typeof window !== 'undefined' && + typeof document !== 'undefined' && + !ENVIRONMENT_IS_NODE + ? 1 + : 0; + } + /** @__sig vppi */ + function _emnapi_after_uvthreadpool_ready(callback, q, type) { + if (uvThreadpoolReady.ready) { + wasmTable.get(callback)(q, type); + } else { + uvThreadpoolReady.then(function () { + wasmTable.get(callback)(q, type); }); - /** - * @__postset - * ``` - * emnapiAWST.init(); - * ``` - */ - var emnapiAWST = { - idGen: {}, - values: [undefined], - queued: new Set(), - pending: [], - init: function () { - var idGen = { - nextId: 1, - list: [], - generate: function () { - var id; - if (idGen.list.length) { - id = idGen.list.shift(); - } - else { - id = idGen.nextId; - idGen.nextId++; - } - return id; - }, - reuse: function (id) { - idGen.list.push(id); - } - }; - emnapiAWST.idGen = idGen; - emnapiAWST.values = [undefined]; - emnapiAWST.queued = new Set(); - emnapiAWST.pending = []; - }, - create: function (env, resource, resourceName, execute, complete, data) { - var asyncId = 0; - var triggerAsyncId = 0; - if (emnapiNodeBinding) { - var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resourceName, -1); - asyncId = asyncContext.asyncId; - triggerAsyncId = asyncContext.triggerAsyncId; - } - var id = emnapiAWST.idGen.generate(); - emnapiAWST.values[id] = { - env: env, - id: id, - resource: resource, - asyncId: asyncId, - triggerAsyncId: triggerAsyncId, - status: 0, - execute: execute, - complete: complete, - data: data - }; - return id; - }, - callComplete: function (work, status) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var complete = work.complete; - var env = work.env; - var data = work.data; - var callback = function () { - if (!complete) - return; - var envObject = emnapiCtx.envStore.get(env); - var scope = emnapiCtx.openScope(envObject); - try { - envObject.callbackIntoModule(true, function () { - (wasmTable.get(complete))(env, status, data); - }); - } - finally { - emnapiCtx.closeScope(envObject, scope); - } - }; - if (emnapiNodeBinding) { - emnapiNodeBinding.node.makeCallback(work.resource, callback, [], { - asyncId: work.asyncId, - triggerAsyncId: work.triggerAsyncId - }); - } - else { - callback(); - } - }, - queue: function (id) { - var work = emnapiAWST.values[id]; - if (!work) - return; - if (work.status === 0) { - work.status = 1; - if (emnapiAWST.queued.size >= (Math.abs(emnapiAsyncWorkPoolSize) || 4)) { - emnapiAWST.pending.push(id); - return; - } - emnapiAWST.queued.add(id); - var env_1 = work.env; - var data_1 = work.data; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var execute = work.execute; - work.status = 2; - emnapiCtx.feature.setImmediate(function () { - (wasmTable.get(execute))(env_1, data_1); - emnapiAWST.queued.delete(id); - work.status = 3; - emnapiCtx.feature.setImmediate(function () { - emnapiAWST.callComplete(work, 0 /* napi_status.napi_ok */); - }); - if (emnapiAWST.pending.length > 0) { - var nextWorkId = emnapiAWST.pending.shift(); - emnapiAWST.values[nextWorkId].status = 0; - emnapiAWST.queue(nextWorkId); - } - }); - } - }, - cancel: function (id) { - var index = emnapiAWST.pending.indexOf(id); - if (index !== -1) { - var work_1 = emnapiAWST.values[id]; - if (work_1 && (work_1.status === 1)) { - work_1.status = 4; - emnapiAWST.pending.splice(index, 1); - emnapiCtx.feature.setImmediate(function () { - emnapiAWST.callComplete(work_1, 11 /* napi_status.napi_cancelled */); - }); - return 0 /* napi_status.napi_ok */; - } - else { - return 9 /* napi_status.napi_generic_failure */; - } + } + } + /** @__sig vpi */ + function _emnapi_tell_js_uvthreadpool(threads, size) { + var p = []; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var _loop_1 = function (i) { + var pthreadPtr = HEAP_DATA_VIEW.getInt32(threads + i * 4, true); + var worker = emnapiGetWorkerByPthreadPtr(pthreadPtr); + p.push( + new Promise(function (resolve) { + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__ && __emnapi__.type === 'async-thread-ready') { + resolve(); + if (worker && typeof worker.unref === 'function') { + worker.unref(); } - return 9 /* napi_status.napi_generic_failure */; - }, - remove: function (id) { - var work = emnapiAWST.values[id]; - if (!work) - return; - if (emnapiNodeBinding) { - emnapiNodeBinding.node.emitAsyncDestroy({ - asyncId: work.asyncId, - triggerAsyncId: work.triggerAsyncId - }); + { + worker.removeEventListener('message', handler); } - emnapiAWST.values[id] = undefined; - emnapiAWST.idGen.reuse(id); - } + } + }; + { + worker.addEventListener('message', handler); + } + }), + ); + }; + for (var i = 0; i < size; i++) { + _loop_1(i); + } + Promise.all(p).then(uvThreadpoolReadyResolve); + } + /** @__sig v */ + function _emnapi_emit_async_thread_ready() { + if (!ENVIRONMENT_IS_PTHREAD) return; + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'async-thread-ready', + payload: {}, + }, + }); + } + var asyncMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_after_uvthreadpool_ready: _emnapi_after_uvthreadpool_ready, + _emnapi_async_send_js: _emnapi_async_send_js, + _emnapi_emit_async_thread_ready: _emnapi_emit_async_thread_ready, + _emnapi_is_main_browser_thread: _emnapi_is_main_browser_thread, + _emnapi_tell_js_uvthreadpool: _emnapi_tell_js_uvthreadpool, + _emnapi_worker_unref: _emnapi_worker_unref, + }); + /* eslint-disable @typescript-eslint/indent */ + /** @__sig ipjp */ + function napi_adjust_external_memory(env, change_in_bytes, adjusted_value) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!adjusted_value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var change_in_bytes_number = Number(change_in_bytes); + if (change_in_bytes_number < 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var old_size = wasmMemory.buffer.byteLength; + var new_size = old_size + change_in_bytes_number; + new_size = new_size + ((65536 - (new_size % 65536)) % 65536); + if (wasmMemory.grow((new_size - old_size + 65535) >> 16) === -1) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (emnapiCtx.feature.supportBigInt) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setBigInt64( + adjusted_value, + BigInt(wasmMemory.buffer.byteLength), + true, + ); + } else { + $emnapiSetValueI64(adjusted_value, wasmMemory.buffer.byteLength); + } + return envObject.clearLastError(); + } + var memoryMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_adjust_external_memory: napi_adjust_external_memory, + }); + /** + * @__postset + * ``` + * emnapiAWST.init(); + * ``` + */ + var emnapiAWST = { + idGen: {}, + values: [undefined], + queued: new Set(), + pending: [], + init: function () { + var idGen = { + nextId: 1, + list: [], + generate: function () { + var id; + if (idGen.list.length) { + id = idGen.list.shift(); + } else { + id = idGen.nextId; + idGen.nextId++; + } + return id; + }, + reuse: function (id) { + idGen.list.push(id); + }, }; - /** @__sig vppdp */ - function _emnapi_node_emit_async_init(async_resource, async_resource_name, trigger_async_id, result) { - if (!emnapiNodeBinding) - return; - var resource = emnapiCtx.handleStore.get(async_resource).value; - var resource_name = emnapiCtx.handleStore.get(async_resource_name).value; - var asyncContext = emnapiNodeBinding.node.emitAsyncInit(resource, resource_name, trigger_async_id); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var asyncId = asyncContext.asyncId; - var triggerAsyncId = asyncContext.triggerAsyncId; - if (result) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setFloat64(result, asyncId, true); - HEAP_DATA_VIEW.setFloat64(result + 8, triggerAsyncId, true); + emnapiAWST.idGen = idGen; + emnapiAWST.values = [undefined]; + emnapiAWST.queued = new Set(); + emnapiAWST.pending = []; + }, + create: function (env, resource, resourceName, execute, complete, data) { + var asyncId = 0; + var triggerAsyncId = 0; + if (emnapiNodeBinding) { + var asyncContext = emnapiNodeBinding.node.emitAsyncInit( + resource, + resourceName, + -1, + ); + asyncId = asyncContext.asyncId; + triggerAsyncId = asyncContext.triggerAsyncId; + } + var id = emnapiAWST.idGen.generate(); + emnapiAWST.values[id] = { + env: env, + id: id, + resource: resource, + asyncId: asyncId, + triggerAsyncId: triggerAsyncId, + status: 0, + execute: execute, + complete: complete, + data: data, + }; + return id; + }, + callComplete: function (work, status) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var complete = work.complete; + var env = work.env; + var data = work.data; + var callback = function () { + if (!complete) return; + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + try { + envObject.callbackIntoModule(true, function () { + wasmTable.get(complete)(env, status, data); + }); + } finally { + emnapiCtx.closeScope(envObject, scope); + } + }; + if (emnapiNodeBinding) { + emnapiNodeBinding.node.makeCallback(work.resource, callback, [], { + asyncId: work.asyncId, + triggerAsyncId: work.triggerAsyncId, + }); + } else { + callback(); + } + }, + queue: function (id) { + var work = emnapiAWST.values[id]; + if (!work) return; + if (work.status === 0) { + work.status = 1; + if ( + emnapiAWST.queued.size >= (Math.abs(emnapiAsyncWorkPoolSize) || 4) + ) { + emnapiAWST.pending.push(id); + return; + } + emnapiAWST.queued.add(id); + var env_1 = work.env; + var data_1 = work.data; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var execute = work.execute; + work.status = 2; + emnapiCtx.feature.setImmediate(function () { + wasmTable.get(execute)(env_1, data_1); + emnapiAWST.queued.delete(id); + work.status = 3; + emnapiCtx.feature.setImmediate(function () { + emnapiAWST.callComplete(work, 0 /* napi_status.napi_ok */); + }); + if (emnapiAWST.pending.length > 0) { + var nextWorkId = emnapiAWST.pending.shift(); + emnapiAWST.values[nextWorkId].status = 0; + emnapiAWST.queue(nextWorkId); } + }); } - /** @__sig vdd */ - function _emnapi_node_emit_async_destroy(async_id, trigger_async_id) { - if (!emnapiNodeBinding) - return; - emnapiNodeBinding.node.emitAsyncDestroy({ - asyncId: async_id, - triggerAsyncId: trigger_async_id + }, + cancel: function (id) { + var index = emnapiAWST.pending.indexOf(id); + if (index !== -1) { + var work_1 = emnapiAWST.values[id]; + if (work_1 && work_1.status === 1) { + work_1.status = 4; + emnapiAWST.pending.splice(index, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiAWST.callComplete( + work_1, + 11 /* napi_status.napi_cancelled */, + ); }); - } - /* vpddp export function _emnapi_node_open_callback_scope (async_resource: napi_value, async_id: double, trigger_async_id: double, result: Pointer): void { + return 0 /* napi_status.napi_ok */; + } else { + return 9 /* napi_status.napi_generic_failure */; + } + } + return 9 /* napi_status.napi_generic_failure */; + }, + remove: function (id) { + var work = emnapiAWST.values[id]; + if (!work) return; + if (emnapiNodeBinding) { + emnapiNodeBinding.node.emitAsyncDestroy({ + asyncId: work.asyncId, + triggerAsyncId: work.triggerAsyncId, + }); + } + emnapiAWST.values[id] = undefined; + emnapiAWST.idGen.reuse(id); + }, + }; + /** @__sig vppdp */ + function _emnapi_node_emit_async_init( + async_resource, + async_resource_name, + trigger_async_id, + result, + ) { + if (!emnapiNodeBinding) return; + var resource = emnapiCtx.handleStore.get(async_resource).value; + var resource_name = emnapiCtx.handleStore.get(async_resource_name).value; + var asyncContext = emnapiNodeBinding.node.emitAsyncInit( + resource, + resource_name, + trigger_async_id, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var asyncId = asyncContext.asyncId; + var triggerAsyncId = asyncContext.triggerAsyncId; + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, asyncId, true); + HEAP_DATA_VIEW.setFloat64(result + 8, triggerAsyncId, true); + } + } + /** @__sig vdd */ + function _emnapi_node_emit_async_destroy(async_id, trigger_async_id) { + if (!emnapiNodeBinding) return; + emnapiNodeBinding.node.emitAsyncDestroy({ + asyncId: async_id, + triggerAsyncId: trigger_async_id, + }); + } + /* vpddp export function _emnapi_node_open_callback_scope (async_resource: napi_value, async_id: double, trigger_async_id: double, result: Pointer): void { if (!emnapiNodeBinding || !result) return const resource = emnapiCtx.handleStore.get(async_resource)!.value // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -952,352 +1033,402 @@ function createNapiModule(options) { const nativeCallbackScopePointer = $_TODO_makeGetValue('scope', 0, 'i64') emnapiNodeBinding.node.closeCallbackScope(BigInt(nativeCallbackScopePointer)) } */ - /** @__sig ipppppddp */ - function _emnapi_node_make_callback(env, async_resource, cb, argv, size, async_id, trigger_async_id, result) { - var i = 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!emnapiNodeBinding) - return; - var resource = emnapiCtx.handleStore.get(async_resource).value; - var callback = emnapiCtx.handleStore.get(cb).value; - size = size >>> 0; - var arr = Array(size); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (; i < size; i++) { - var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); - arr[i] = emnapiCtx.handleStore.get(argVal).value; - } - var ret = emnapiNodeBinding.node.makeCallback(resource, callback, arr, { - asyncId: async_id, - triggerAsyncId: trigger_async_id - }); - if (result) { - var envObject = emnapiCtx.envStore.get(env); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = envObject.ensureHandleId(ret); - HEAP_DATA_VIEW.setInt32(result, v, true); - } + /** @__sig ipppppddp */ + function _emnapi_node_make_callback( + env, + async_resource, + cb, + argv, + size, + async_id, + trigger_async_id, + result, + ) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!emnapiNodeBinding) return; + var resource = emnapiCtx.handleStore.get(async_resource).value; + var callback = emnapiCtx.handleStore.get(cb).value; + size = size >>> 0; + var arr = Array(size); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (; i < size; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + arr[i] = emnapiCtx.handleStore.get(argVal).value; + } + var ret = emnapiNodeBinding.node.makeCallback(resource, callback, arr, { + asyncId: async_id, + triggerAsyncId: trigger_async_id, + }); + if (result) { + var envObject = emnapiCtx.envStore.get(env); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + } + /** @__sig ippp */ + function _emnapi_async_init_js( + async_resource, + async_resource_name, + result, + ) { + if (!emnapiNodeBinding) { + return 9 /* napi_status.napi_generic_failure */; + } + var resource; + if (async_resource) { + resource = Object(emnapiCtx.handleStore.get(async_resource).value); + } + var name = emnapiCtx.handleStore.get(async_resource_name).value; + var ret = emnapiNodeBinding.napi.asyncInit(resource, name); + if (ret.status !== 0) return ret.status; + var numberValue = ret.value; + if ( + !( + numberValue >= BigInt(-1) * (BigInt(1) << BigInt(63)) && + numberValue < BigInt(1) << BigInt(63) + ) + ) { + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + if (numberValue >= BigInt(1) << BigInt(63)) { + numberValue = numberValue - (BigInt(1) << BigInt(64)); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, low, true); + HEAP_DATA_VIEW.setInt32(result + 4, high, true); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ip */ + function _emnapi_async_destroy_js(async_context) { + if (!emnapiNodeBinding) { + return 9 /* napi_status.napi_generic_failure */; + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var low = HEAP_DATA_VIEW.getInt32(async_context, true); + var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); + var pointer = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); + var ret = emnapiNodeBinding.napi.asyncDestroy(pointer); + if (ret.status !== 0) return ret.status; + return 0 /* napi_status.napi_ok */; + } + // https://github.com/nodejs/node-addon-api/pull/1283 + /** @__sig ipppp */ + function napi_open_callback_scope( + env, + ignored, + async_context_handle, + result, + ) { + throw new Error('napi_open_callback_scope has not been implemented yet'); + } + /** @__sig ipp */ + function napi_close_callback_scope(env, scope) { + throw new Error('napi_close_callback_scope has not been implemented yet'); + } + /** @__sig ippppppp */ + function napi_make_callback( + env, + async_context, + recv, + func, + argc, + argv, + result, + ) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!emnapiNodeBinding) { + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + if (!recv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v8recv = Object(emnapiCtx.handleStore.get(recv).value); + var v8func = emnapiCtx.handleStore.get(func).value; + if (typeof v8func !== 'function') { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var low = HEAP_DATA_VIEW.getInt32(async_context, true); + var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); + var ctx = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); + argc = argc >>> 0; + var arr = Array(argc); + for (; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + arr[i] = emnapiCtx.handleStore.get(argVal).value; + } + var ret = emnapiNodeBinding.napi.makeCallback(ctx, v8recv, v8func, arr); + if (ret.error) { + throw ret.error; + } + if (ret.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(ret.status); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(ret.value); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig vp */ + function _emnapi_env_check_gc_access(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + } + var nodeMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_async_destroy_js: _emnapi_async_destroy_js, + _emnapi_async_init_js: _emnapi_async_init_js, + _emnapi_env_check_gc_access: _emnapi_env_check_gc_access, + _emnapi_node_emit_async_destroy: _emnapi_node_emit_async_destroy, + _emnapi_node_emit_async_init: _emnapi_node_emit_async_init, + _emnapi_node_make_callback: _emnapi_node_make_callback, + napi_close_callback_scope: napi_close_callback_scope, + napi_make_callback: napi_make_callback, + napi_open_callback_scope: napi_open_callback_scope, + }); + /** + * @__deps malloc + * @__deps free + * @__postset + * ``` + * emnapiTSFN.init(); + * ``` + */ + var emnapiTSFN = { + offset: { + /* napi_ref */ resource: 0, + /* double */ async_id: 8, + /* double */ trigger_async_id: 16, + /* size_t */ queue_size: 24, + /* void* */ queue: 1 * 4 + 24, + /* size_t */ thread_count: 2 * 4 + 24, + /* bool */ is_closing: 3 * 4 + 24, + /* atomic_uchar */ dispatch_state: 3 * 4 + 28, + /* void* */ context: 3 * 4 + 32, + /* size_t */ max_queue_size: 4 * 4 + 32, + /* napi_ref */ ref: 5 * 4 + 32, + /* napi_env */ env: 6 * 4 + 32, + /* void* */ finalize_data: 7 * 4 + 32, + /* napi_finalize */ finalize_cb: 8 * 4 + 32, + /* napi_threadsafe_function_call_js */ call_js_cb: 9 * 4 + 32, + /* bool */ handles_closing: 10 * 4 + 32, + /* bool */ async_ref: 10 * 4 + 36, + /* int32_t */ mutex: 10 * 4 + 40, + /* int32_t */ cond: 10 * 4 + 44, + end: 10 * 4 + 48, + }, + init: function () { + if (typeof PThread !== 'undefined') { + PThread.unusedWorkers.forEach(emnapiTSFN.addListener); + PThread.runningWorkers.forEach(emnapiTSFN.addListener); + var __original_getNewWorker_1 = PThread.getNewWorker; + PThread.getNewWorker = function () { + var r = __original_getNewWorker_1.apply(this, arguments); + emnapiTSFN.addListener(r); + return r; + }; + } + }, + addListener: function (worker) { + if (!worker) return false; + if (worker._emnapiTSFNListener) return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__) { + var type = __emnapi__.type; + var payload = __emnapi__.payload; + if (type === 'tsfn-send') { + emnapiTSFN.dispatch(payload.tsfn); + } + } + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiTSFNListener; + }; + worker._emnapiTSFNListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); } - /** @__sig ippp */ - function _emnapi_async_init_js(async_resource, async_resource_name, result) { - if (!emnapiNodeBinding) { - return 9 /* napi_status.napi_generic_failure */; - } - var resource; - if (async_resource) { - resource = Object(emnapiCtx.handleStore.get(async_resource).value); - } - var name = emnapiCtx.handleStore.get(async_resource_name).value; - var ret = emnapiNodeBinding.napi.asyncInit(resource, name); - if (ret.status !== 0) - return ret.status; - var numberValue = ret.value; - if (!((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63))))) { - numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); - if (numberValue >= (BigInt(1) << BigInt(63))) { - numberValue = numberValue - (BigInt(1) << BigInt(64)); - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var low = Number(numberValue & BigInt(0xffffffff)); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var high = Number(numberValue >> BigInt(32)); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, low, true); - HEAP_DATA_VIEW.setInt32(result + 4, high, true); - return 0 /* napi_status.napi_ok */; - } - /** @__sig ip */ - function _emnapi_async_destroy_js(async_context) { - if (!emnapiNodeBinding) { - return 9 /* napi_status.napi_generic_failure */; + return true; + }, + initQueue: function (func) { + var size = 2 * 4; + var queue = _malloc(size); + if (!queue) return false; + new Uint8Array(wasmMemory.buffer, queue, size).fill(0); + emnapiTSFN.storeSizeTypeValue( + func + emnapiTSFN.offset.queue, + queue, + false, + ); + return true; + }, + destroyQueue: function (func) { + var queue = emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.queue, + false, + ); + if (queue) { + _free(queue); + } + }, + pushQueue: function (func, data) { + var queue = emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.queue, + false, + ); + var head = emnapiTSFN.loadSizeTypeValue(queue, false); + var tail = emnapiTSFN.loadSizeTypeValue(queue + 4, false); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var size = 2 * 4; + var node = _malloc(size); + if (!node) throw new Error('OOM'); + emnapiTSFN.storeSizeTypeValue(node, data, false); + emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); + if (head === 0 && tail === 0) { + emnapiTSFN.storeSizeTypeValue(queue, node, false); + emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); + } else { + emnapiTSFN.storeSizeTypeValue(tail + 4, node, false); + emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); + } + emnapiTSFN.addQueueSize(func); + }, + shiftQueue: function (func) { + var queue = emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.queue, + false, + ); + var head = emnapiTSFN.loadSizeTypeValue(queue, false); + if (head === 0) return 0; + var node = head; + var next = emnapiTSFN.loadSizeTypeValue(head + 4, false); + emnapiTSFN.storeSizeTypeValue(queue, next, false); + if (next === 0) { + emnapiTSFN.storeSizeTypeValue(queue + 4, 0, false); + } + emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); + var value = emnapiTSFN.loadSizeTypeValue(node, false); + _free(node); + emnapiTSFN.subQueueSize(func); + return value; + }, + push: function (func, data, mode) { + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + var waitCondition = function () { + var queueSize = emnapiTSFN.getQueueSize(func); + var maxSize = emnapiTSFN.getMaxQueueSize(func); + var isClosing = emnapiTSFN.getIsClosing(func); + return queueSize >= maxSize && maxSize > 0 && !isClosing; + }; + var isBrowserMain = + typeof window !== 'undefined' && + typeof document !== 'undefined' && + !ENVIRONMENT_IS_NODE; + return mutex.execute(function () { + while (waitCondition()) { + if ( + mode === + 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */ + ) { + return 15 /* napi_status.napi_queue_full */; } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var low = HEAP_DATA_VIEW.getInt32(async_context, true); - var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); - var pointer = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); - var ret = emnapiNodeBinding.napi.asyncDestroy(pointer); - if (ret.status !== 0) - return ret.status; + /** + * Browser JS main thread can not use `Atomics.wait` + * + * Related: + * https://github.com/nodejs/node/pull/32689 + * https://github.com/nodejs/node/pull/33453 + */ + if (isBrowserMain) { + return 21 /* napi_status.napi_would_deadlock */; + } + cond.wait(); + } + if (emnapiTSFN.getIsClosing(func)) { + if (emnapiTSFN.getThreadCount(func) === 0) { + return 1 /* napi_status.napi_invalid_arg */; + } else { + emnapiTSFN.subThreadCount(func); + return 16 /* napi_status.napi_closing */; + } + } else { + emnapiTSFN.pushQueue(func, data); + emnapiTSFN.send(func); return 0 /* napi_status.napi_ok */; - } - // https://github.com/nodejs/node-addon-api/pull/1283 - /** @__sig ipppp */ - function napi_open_callback_scope(env, ignored, async_context_handle, result) { - throw new Error('napi_open_callback_scope has not been implemented yet'); - } - /** @__sig ipp */ - function napi_close_callback_scope(env, scope) { - throw new Error('napi_close_callback_scope has not been implemented yet'); - } - /** @__sig ippppppp */ - function napi_make_callback(env, async_context, recv, func, argc, argv, result) { - var i = 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!emnapiNodeBinding) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!recv) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (argc > 0) { - if (!argv) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var v8recv = Object(emnapiCtx.handleStore.get(recv).value); - var v8func = emnapiCtx.handleStore.get(func).value; - if (typeof v8func !== 'function') { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var low = HEAP_DATA_VIEW.getInt32(async_context, true); - var high = HEAP_DATA_VIEW.getInt32(async_context + 4, true); - var ctx = BigInt(low >>> 0) | (BigInt(high) << BigInt(32)); - argc = argc >>> 0; - var arr = Array(argc); - for (; i < argc; i++) { - var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); - arr[i] = emnapiCtx.handleStore.get(argVal).value; - } - var ret = emnapiNodeBinding.napi.makeCallback(ctx, v8recv, v8func, arr); - if (ret.error) { - throw ret.error; - } - if (ret.status !== 0 /* napi_status.napi_ok */) - return envObject.setLastError(ret.status); - if (result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = envObject.ensureHandleId(ret.value); - HEAP_DATA_VIEW.setInt32(result, v, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig vp */ - function _emnapi_env_check_gc_access(env) { - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - } - var nodeMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - _emnapi_async_destroy_js: _emnapi_async_destroy_js, - _emnapi_async_init_js: _emnapi_async_init_js, - _emnapi_env_check_gc_access: _emnapi_env_check_gc_access, - _emnapi_node_emit_async_destroy: _emnapi_node_emit_async_destroy, - _emnapi_node_emit_async_init: _emnapi_node_emit_async_init, - _emnapi_node_make_callback: _emnapi_node_make_callback, - napi_close_callback_scope: napi_close_callback_scope, - napi_make_callback: napi_make_callback, - napi_open_callback_scope: napi_open_callback_scope + } }); - /** - * @__deps malloc - * @__deps free - * @__postset - * ``` - * emnapiTSFN.init(); - * ``` - */ - var emnapiTSFN = { - offset: { - /* napi_ref */ resource: 0, - /* double */ async_id: 8, - /* double */ trigger_async_id: 16, - /* size_t */ queue_size: 24, - /* void* */ queue: 1 * 4 + 24, - /* size_t */ thread_count: 2 * 4 + 24, - /* bool */ is_closing: 3 * 4 + 24, - /* atomic_uchar */ dispatch_state: 3 * 4 + 28, - /* void* */ context: 3 * 4 + 32, - /* size_t */ max_queue_size: 4 * 4 + 32, - /* napi_ref */ ref: 5 * 4 + 32, - /* napi_env */ env: 6 * 4 + 32, - /* void* */ finalize_data: 7 * 4 + 32, - /* napi_finalize */ finalize_cb: 8 * 4 + 32, - /* napi_threadsafe_function_call_js */ call_js_cb: 9 * 4 + 32, - /* bool */ handles_closing: 10 * 4 + 32, - /* bool */ async_ref: 10 * 4 + 36, - /* int32_t */ mutex: 10 * 4 + 40, - /* int32_t */ cond: 10 * 4 + 44, - end: 10 * 4 + 48 - }, - init: function () { - if (typeof PThread !== 'undefined') { - PThread.unusedWorkers.forEach(emnapiTSFN.addListener); - PThread.runningWorkers.forEach(emnapiTSFN.addListener); - var __original_getNewWorker_1 = PThread.getNewWorker; - PThread.getNewWorker = function () { - var r = __original_getNewWorker_1.apply(this, arguments); - emnapiTSFN.addListener(r); - return r; - }; - } - }, - addListener: function (worker) { - if (!worker) - return false; - if (worker._emnapiTSFNListener) - return true; - var handler = function (e) { - var data = e.data; - var __emnapi__ = data.__emnapi__; - if (__emnapi__) { - var type = __emnapi__.type; - var payload = __emnapi__.payload; - if (type === 'tsfn-send') { - emnapiTSFN.dispatch(payload.tsfn); - } - } - }; - var dispose = function () { - { - worker.removeEventListener('message', handler, false); - } - delete worker._emnapiTSFNListener; - }; - worker._emnapiTSFNListener = { handler: handler, dispose: dispose }; - { - worker.addEventListener('message', handler, false); - } - return true; - }, - initQueue: function (func) { - var size = 2 * 4; - var queue = _malloc(size); - if (!queue) - return false; - new Uint8Array(wasmMemory.buffer, queue, size).fill(0); - emnapiTSFN.storeSizeTypeValue(func + emnapiTSFN.offset.queue, queue, false); - return true; - }, - destroyQueue: function (func) { - var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); - if (queue) { - _free(queue); - } - }, - pushQueue: function (func, data) { - var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); - var head = emnapiTSFN.loadSizeTypeValue(queue, false); - var tail = emnapiTSFN.loadSizeTypeValue(queue + 4, false); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var size = 2 * 4; - var node = _malloc(size); - if (!node) - throw new Error('OOM'); - emnapiTSFN.storeSizeTypeValue(node, data, false); - emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); - if (head === 0 && tail === 0) { - emnapiTSFN.storeSizeTypeValue(queue, node, false); - emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); - } - else { - emnapiTSFN.storeSizeTypeValue(tail + 4, node, false); - emnapiTSFN.storeSizeTypeValue(queue + 4, node, false); - } - emnapiTSFN.addQueueSize(func); - }, - shiftQueue: function (func) { - var queue = emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue, false); - var head = emnapiTSFN.loadSizeTypeValue(queue, false); - if (head === 0) - return 0; - var node = head; - var next = emnapiTSFN.loadSizeTypeValue(head + 4, false); - emnapiTSFN.storeSizeTypeValue(queue, next, false); - if (next === 0) { - emnapiTSFN.storeSizeTypeValue(queue + 4, 0, false); - } - emnapiTSFN.storeSizeTypeValue(node + 4, 0, false); - var value = emnapiTSFN.loadSizeTypeValue(node, false); - _free(node); - emnapiTSFN.subQueueSize(func); - return value; - }, - push: function (func, data, mode) { - var mutex = emnapiTSFN.getMutex(func); - var cond = emnapiTSFN.getCond(func); - var waitCondition = function () { - var queueSize = emnapiTSFN.getQueueSize(func); - var maxSize = emnapiTSFN.getMaxQueueSize(func); - var isClosing = emnapiTSFN.getIsClosing(func); - return queueSize >= maxSize && maxSize > 0 && !isClosing; - }; - var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE; - return mutex.execute(function () { - while (waitCondition()) { - if (mode === 0 /* napi_threadsafe_function_call_mode.napi_tsfn_nonblocking */) { - return 15 /* napi_status.napi_queue_full */; - } - /** - * Browser JS main thread can not use `Atomics.wait` - * - * Related: - * https://github.com/nodejs/node/pull/32689 - * https://github.com/nodejs/node/pull/33453 - */ - if (isBrowserMain) { - return 21 /* napi_status.napi_would_deadlock */; - } - cond.wait(); - } - if (emnapiTSFN.getIsClosing(func)) { - if (emnapiTSFN.getThreadCount(func) === 0) { - return 1 /* napi_status.napi_invalid_arg */; - } - else { - emnapiTSFN.subThreadCount(func); - return 16 /* napi_status.napi_closing */; - } - } - else { - emnapiTSFN.pushQueue(func, data); - emnapiTSFN.send(func); - return 0 /* napi_status.napi_ok */; - } - }); - }, - getMutex: function (func) { - var index = func + emnapiTSFN.offset.mutex; - var mutex = { - lock: function () { - var isBrowserMain = typeof window !== 'undefined' && typeof document !== 'undefined' && !ENVIRONMENT_IS_NODE; - var i32a = new Int32Array(wasmMemory.buffer, index, 1); - if (isBrowserMain) { - while (true) { - var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); - if (oldValue === 0) { - return; - } - } - } - else { - while (true) { - var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); - if (oldValue === 0) { - return; - } - Atomics.wait(i32a, 0, 1); - } - } - }, - /* lockAsync () { + }, + getMutex: function (func) { + var index = func + emnapiTSFN.offset.mutex; + var mutex = { + lock: function () { + var isBrowserMain = + typeof window !== 'undefined' && + typeof document !== 'undefined' && + !ENVIRONMENT_IS_NODE; + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + if (isBrowserMain) { + while (true) { + var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); + if (oldValue === 0) { + return; + } + } + } else { + while (true) { + var oldValue = Atomics.compareExchange(i32a, 0, 0, 1); + if (oldValue === 0) { + return; + } + Atomics.wait(i32a, 0, 1); + } + } + }, + /* lockAsync () { return new Promise(resolve => { const again = (): void => { fn() } const fn = (): void => { @@ -1312,23 +1443,22 @@ function createNapiModule(options) { fn() }) }, */ - unlock: function () { - var i32a = new Int32Array(wasmMemory.buffer, index, 1); - var oldValue = Atomics.compareExchange(i32a, 0, 1, 0); - if (oldValue !== 1) { - throw new Error('Tried to unlock while not holding the mutex'); - } - Atomics.notify(i32a, 0, 1); - }, - execute: function (fn) { - mutex.lock(); - try { - return fn(); - } - finally { - mutex.unlock(); - } - } /* , + unlock: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + var oldValue = Atomics.compareExchange(i32a, 0, 1, 0); + if (oldValue !== 1) { + throw new Error('Tried to unlock while not holding the mutex'); + } + Atomics.notify(i32a, 0, 1); + }, + execute: function (fn) { + mutex.lock(); + try { + return fn(); + } finally { + mutex.unlock(); + } + } /* , executeAsync (fn: () => Promise): Promise { return mutex.lockAsync().then(() => { const r = fn() @@ -1338,22 +1468,22 @@ function createNapiModule(options) { mutex.unlock() throw err }) - } */ - }; - return mutex; - }, - getCond: function (func) { - var index = func + emnapiTSFN.offset.cond; - var mutex = emnapiTSFN.getMutex(func); - var cond = { - wait: function () { - var i32a = new Int32Array(wasmMemory.buffer, index, 1); - var value = Atomics.load(i32a, 0); - mutex.unlock(); - Atomics.wait(i32a, 0, value); - mutex.lock(); - }, - /* waitAsync () { + } */, + }; + return mutex; + }, + getCond: function (func) { + var index = func + emnapiTSFN.offset.cond; + var mutex = emnapiTSFN.getMutex(func); + var cond = { + wait: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + var value = Atomics.load(i32a, 0); + mutex.unlock(); + Atomics.wait(i32a, 0, value); + mutex.lock(); + }, + /* waitAsync () { const i32a = new Int32Array(wasmMemory.buffer, index, 1) const value = Atomics.load(i32a, 0) mutex.unlock() @@ -1364,6174 +1494,7518 @@ function createNapiModule(options) { return lock() } }, */ - signal: function () { - var i32a = new Int32Array(wasmMemory.buffer, index, 1); - Atomics.add(i32a, 0, 1); - Atomics.notify(i32a, 0, 1); - } - }; - return cond; - }, - getQueueSize: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.queue_size, true); - }, - addQueueSize: function (func) { - var offset = emnapiTSFN.offset.queue_size; - var arr, index; - arr = new Uint32Array(wasmMemory.buffer); - index = (func + offset) >> 2; - Atomics.add(arr, index, 1); - }, - subQueueSize: function (func) { - var offset = emnapiTSFN.offset.queue_size; - var arr, index; - arr = new Uint32Array(wasmMemory.buffer); - index = (func + offset) >> 2; - Atomics.sub(arr, index, 1); - }, - getThreadCount: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.thread_count, true); - }, - addThreadCount: function (func) { - var offset = emnapiTSFN.offset.thread_count; - var arr, index; - arr = new Uint32Array(wasmMemory.buffer); - index = (func + offset) >> 2; - Atomics.add(arr, index, 1); - }, - subThreadCount: function (func) { - var offset = emnapiTSFN.offset.thread_count; - var arr, index; - arr = new Uint32Array(wasmMemory.buffer); - index = (func + offset) >> 2; - Atomics.sub(arr, index, 1); - }, - getIsClosing: function (func) { - return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2); - }, - setIsClosing: function (func, value) { - Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.is_closing) >> 2, value); - }, - getHandlesClosing: function (func) { - return Atomics.load(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2); - }, - setHandlesClosing: function (func, value) { - Atomics.store(new Int32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.handles_closing) >> 2, value); - }, - getDispatchState: function (func) { - return Atomics.load(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2); - }, - getContext: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.context, false); - }, - getMaxQueueSize: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.max_queue_size, true); - }, - getEnv: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.env, false); - }, - getCallJSCb: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.call_js_cb, false); - }, - getRef: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.ref, false); - }, - getResource: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.resource, false); - }, - getFinalizeCb: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_cb, false); - }, - getFinalizeData: function (func) { - return emnapiTSFN.loadSizeTypeValue(func + emnapiTSFN.offset.finalize_data, false); - }, - loadSizeTypeValue: function (offset, unsigned) { - var ret; - var arr; - if (unsigned) { - arr = new Uint32Array(wasmMemory.buffer); - ret = Atomics.load(arr, offset >> 2); - return ret; - } - else { - arr = new Int32Array(wasmMemory.buffer); - ret = Atomics.load(arr, offset >> 2); - return ret; - } - }, - storeSizeTypeValue: function (offset, value, unsigned) { - var arr; - if (unsigned) { - arr = new Uint32Array(wasmMemory.buffer); - Atomics.store(arr, offset >> 2, value); - return undefined; - } - else { - arr = new Int32Array(wasmMemory.buffer); - Atomics.store(arr, offset >> 2, value >>> 0); - return undefined; - } - }, - destroy: function (func) { - emnapiTSFN.destroyQueue(func); - var env = emnapiTSFN.getEnv(func); - var envObject = emnapiCtx.envStore.get(env); - var ref = emnapiTSFN.getRef(func); - if (ref) { - emnapiCtx.refStore.get(ref).dispose(); - } - emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func); - envObject.unref(); - var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; - var arr = new Int32Array(wasmMemory.buffer); - if (Atomics.load(arr, asyncRefOffset)) { - Atomics.store(arr, asyncRefOffset, 0); - emnapiCtx.decreaseWaitingRequestCounter(); - } - var resource = emnapiTSFN.getResource(func); - emnapiCtx.refStore.get(resource).dispose(); - if (emnapiNodeBinding) { - var view = new DataView(wasmMemory.buffer); - var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true); - var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true); - _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); - } - _free(func); - }, - emptyQueueAndDelete: function (func) { - var callJsCb = emnapiTSFN.getCallJSCb(func); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var context = emnapiTSFN.getContext(func); - var data; - while (emnapiTSFN.getQueueSize(func) > 0) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - data = emnapiTSFN.shiftQueue(func); - if (callJsCb) { - (wasmTable.get(callJsCb))(0, 0, context, data); - } - } - emnapiTSFN.destroy(func); - }, - finalize: function (func) { - var env = emnapiTSFN.getEnv(func); - var envObject = emnapiCtx.envStore.get(env); - emnapiCtx.openScope(envObject); - var finalize = emnapiTSFN.getFinalizeCb(func); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var data = emnapiTSFN.getFinalizeData(func); + signal: function () { + var i32a = new Int32Array(wasmMemory.buffer, index, 1); + Atomics.add(i32a, 0, 1); + Atomics.notify(i32a, 0, 1); + }, + }; + return cond; + }, + getQueueSize: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.queue_size, + true, + ); + }, + addQueueSize: function (func) { + var offset = emnapiTSFN.offset.queue_size; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.add(arr, index, 1); + }, + subQueueSize: function (func) { + var offset = emnapiTSFN.offset.queue_size; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.sub(arr, index, 1); + }, + getThreadCount: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.thread_count, + true, + ); + }, + addThreadCount: function (func) { + var offset = emnapiTSFN.offset.thread_count; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.add(arr, index, 1); + }, + subThreadCount: function (func) { + var offset = emnapiTSFN.offset.thread_count; + var arr, index; + arr = new Uint32Array(wasmMemory.buffer); + index = (func + offset) >> 2; + Atomics.sub(arr, index, 1); + }, + getIsClosing: function (func) { + return Atomics.load( + new Int32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.is_closing) >> 2, + ); + }, + setIsClosing: function (func, value) { + Atomics.store( + new Int32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.is_closing) >> 2, + value, + ); + }, + getHandlesClosing: function (func) { + return Atomics.load( + new Int32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.handles_closing) >> 2, + ); + }, + setHandlesClosing: function (func, value) { + Atomics.store( + new Int32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.handles_closing) >> 2, + value, + ); + }, + getDispatchState: function (func) { + return Atomics.load( + new Uint32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.dispatch_state) >> 2, + ); + }, + getContext: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.context, + false, + ); + }, + getMaxQueueSize: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.max_queue_size, + true, + ); + }, + getEnv: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.env, + false, + ); + }, + getCallJSCb: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.call_js_cb, + false, + ); + }, + getRef: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.ref, + false, + ); + }, + getResource: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.resource, + false, + ); + }, + getFinalizeCb: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.finalize_cb, + false, + ); + }, + getFinalizeData: function (func) { + return emnapiTSFN.loadSizeTypeValue( + func + emnapiTSFN.offset.finalize_data, + false, + ); + }, + loadSizeTypeValue: function (offset, unsigned) { + var ret; + var arr; + if (unsigned) { + arr = new Uint32Array(wasmMemory.buffer); + ret = Atomics.load(arr, offset >> 2); + return ret; + } else { + arr = new Int32Array(wasmMemory.buffer); + ret = Atomics.load(arr, offset >> 2); + return ret; + } + }, + storeSizeTypeValue: function (offset, value, unsigned) { + var arr; + if (unsigned) { + arr = new Uint32Array(wasmMemory.buffer); + Atomics.store(arr, offset >> 2, value); + return undefined; + } else { + arr = new Int32Array(wasmMemory.buffer); + Atomics.store(arr, offset >> 2, value >>> 0); + return undefined; + } + }, + destroy: function (func) { + emnapiTSFN.destroyQueue(func); + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + var ref = emnapiTSFN.getRef(func); + if (ref) { + emnapiCtx.refStore.get(ref).dispose(); + } + emnapiCtx.removeCleanupHook(envObject, emnapiTSFN.cleanup, func); + envObject.unref(); + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 0); + emnapiCtx.decreaseWaitingRequestCounter(); + } + var resource = emnapiTSFN.getResource(func); + emnapiCtx.refStore.get(resource).dispose(); + if (emnapiNodeBinding) { + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64( + func + emnapiTSFN.offset.async_id, + true, + ); + var triggerAsyncId = view.getFloat64( + func + emnapiTSFN.offset.trigger_async_id, + true, + ); + _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); + } + _free(func); + }, + emptyQueueAndDelete: function (func) { + var callJsCb = emnapiTSFN.getCallJSCb(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var data; + while (emnapiTSFN.getQueueSize(func) > 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + data = emnapiTSFN.shiftQueue(func); + if (callJsCb) { + wasmTable.get(callJsCb)(0, 0, context, data); + } + } + emnapiTSFN.destroy(func); + }, + finalize: function (func) { + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject); + var finalize = emnapiTSFN.getFinalizeCb(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data = emnapiTSFN.getFinalizeData(func); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var f = function () { + envObject.callFinalizerInternal(0, finalize, data, context); + }; + try { + if (finalize) { + if (emnapiNodeBinding) { + var resource = emnapiTSFN.getResource(func); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = + emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64( + func + emnapiTSFN.offset.async_id, + true, + ); + var triggerAsyncId = view.getFloat64( + func + emnapiTSFN.offset.trigger_async_id, + true, + ); + emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { + asyncId: asyncId, + triggerAsyncId: triggerAsyncId, + }); + } else { + f(); + } + } + emnapiTSFN.emptyQueueAndDelete(func); + } finally { + emnapiCtx.closeScope(envObject); + } + }, + cleanup: function (func) { + emnapiTSFN.closeHandlesAndMaybeDelete(func, 1); + }, + closeHandlesAndMaybeDelete: function (func, set_closing) { + var env = emnapiTSFN.getEnv(func); + var envObject = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject); + try { + if (set_closing) { + emnapiTSFN.getMutex(func).execute(function () { + emnapiTSFN.setIsClosing(func, 1); + if (emnapiTSFN.getMaxQueueSize(func) > 0) { + emnapiTSFN.getCond(func).signal(); + } + }); + } + if (emnapiTSFN.getHandlesClosing(func)) { + return; + } + emnapiTSFN.setHandlesClosing(func, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiTSFN.finalize(func); + }); + } finally { + emnapiCtx.closeScope(envObject); + } + }, + dispatchOne: function (func) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data = 0; + var popped_value = false; + var has_more = false; + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + mutex.execute(function () { + if (emnapiTSFN.getIsClosing(func)) { + emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); + } else { + var size = emnapiTSFN.getQueueSize(func); + if (size > 0) { + data = emnapiTSFN.shiftQueue(func); + popped_value = true; + var maxQueueSize = emnapiTSFN.getMaxQueueSize(func); + if (size === maxQueueSize && maxQueueSize > 0) { + cond.signal(); + } + size--; + } + if (size === 0) { + if (emnapiTSFN.getThreadCount(func) === 0) { + emnapiTSFN.setIsClosing(func, 1); + if (emnapiTSFN.getMaxQueueSize(func) > 0) { + cond.signal(); + } + emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); + } + } else { + has_more = true; + } + } + }); + if (popped_value) { + var env = emnapiTSFN.getEnv(func); + var envObject_1 = emnapiCtx.envStore.get(env); + emnapiCtx.openScope(envObject_1); + var f = function () { + envObject_1.callbackIntoModule(false, function () { + var callJsCb = emnapiTSFN.getCallJSCb(func); + var ref = emnapiTSFN.getRef(func); + var js_callback = ref ? emnapiCtx.refStore.get(ref).get() : 0; + if (callJsCb) { // eslint-disable-next-line @typescript-eslint/no-unused-vars var context = emnapiTSFN.getContext(func); - var f = function () { - envObject.callFinalizerInternal(0, finalize, data, context); - }; - try { - if (finalize) { - if (emnapiNodeBinding) { - var resource = emnapiTSFN.getResource(func); - var resource_value = emnapiCtx.refStore.get(resource).get(); - var resourceObject = emnapiCtx.handleStore.get(resource_value).value; - var view = new DataView(wasmMemory.buffer); - var asyncId = view.getFloat64(func + emnapiTSFN.offset.async_id, true); - var triggerAsyncId = view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true); - emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { - asyncId: asyncId, - triggerAsyncId: triggerAsyncId - }); - } - else { - f(); - } - } - emnapiTSFN.emptyQueueAndDelete(func); - } - finally { - emnapiCtx.closeScope(envObject); - } - }, - cleanup: function (func) { - emnapiTSFN.closeHandlesAndMaybeDelete(func, 1); + wasmTable.get(callJsCb)(env, js_callback, context, data); + } else { + var jsCallback = js_callback + ? emnapiCtx.handleStore.get(js_callback).value + : null; + if (typeof jsCallback === 'function') { + jsCallback(); + } + } + }); + }; + try { + if (emnapiNodeBinding) { + var resource = emnapiTSFN.getResource(func); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = + emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { + asyncId: view.getFloat64( + func + emnapiTSFN.offset.async_id, + true, + ), + triggerAsyncId: view.getFloat64( + func + emnapiTSFN.offset.trigger_async_id, + true, + ), + }); + } else { + f(); + } + } finally { + emnapiCtx.closeScope(envObject_1); + } + } + return has_more; + }, + dispatch: function (func) { + var has_more = true; + var iterations_left = 1000; + var ui32a = new Uint32Array(wasmMemory.buffer); + var index = (func + emnapiTSFN.offset.dispatch_state) >> 2; + while (has_more && --iterations_left !== 0) { + Atomics.store(ui32a, index, 1); + has_more = emnapiTSFN.dispatchOne(func); + if (Atomics.exchange(ui32a, index, 0) !== 1) { + has_more = true; + } + } + if (has_more) { + emnapiTSFN.send(func); + } + }, + send: function (func) { + var current_state = Atomics.or( + new Uint32Array(wasmMemory.buffer), + (func + emnapiTSFN.offset.dispatch_state) >> 2, + 1 << 1, + ); + if ((current_state & 1) === 1) { + return; + } + if ( + typeof ENVIRONMENT_IS_PTHREAD !== 'undefined' && + ENVIRONMENT_IS_PTHREAD + ) { + postMessage({ + __emnapi__: { + type: 'tsfn-send', + payload: { + tsfn: func, + }, }, - closeHandlesAndMaybeDelete: function (func, set_closing) { - var env = emnapiTSFN.getEnv(func); - var envObject = emnapiCtx.envStore.get(env); - emnapiCtx.openScope(envObject); - try { - if (set_closing) { - emnapiTSFN.getMutex(func).execute(function () { - emnapiTSFN.setIsClosing(func, 1); - if (emnapiTSFN.getMaxQueueSize(func) > 0) { - emnapiTSFN.getCond(func).signal(); - } - }); - } - if (emnapiTSFN.getHandlesClosing(func)) { - return; - } - emnapiTSFN.setHandlesClosing(func, 1); - emnapiCtx.feature.setImmediate(function () { - emnapiTSFN.finalize(func); - }); - } - finally { - emnapiCtx.closeScope(envObject); - } + }); + } else { + emnapiCtx.feature.setImmediate(function () { + emnapiTSFN.dispatch(func); + }); + } + }, + }; + /** @__sig ippppppppppp */ + function napi_create_threadsafe_function( + env, + func, + async_resource, + async_resource_name, + max_queue_size, + initial_thread_count, + thread_finalize_data, + thread_finalize_cb, + context, + call_js_cb, + result, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!async_resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + max_queue_size = max_queue_size >>> 0; + initial_thread_count = initial_thread_count >>> 0; + if (initial_thread_count === 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var ref = 0; + if (!func) { + if (!call_js_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } else { + var funcValue = emnapiCtx.handleStore.get(func).value; + if (typeof funcValue !== 'function') { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + ref = emnapiCtx.createReference( + envObject, + func, + 1, + 1 /* Ownership.kUserland */, + ).id; + } + var asyncResourceObject; + if (async_resource) { + asyncResourceObject = emnapiCtx.handleStore.get(async_resource).value; + if (asyncResourceObject == null) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + asyncResourceObject = Object(asyncResourceObject); + } else { + asyncResourceObject = {}; + } + var resource = envObject.ensureHandleId(asyncResourceObject); + var asyncResourceName = + emnapiCtx.handleStore.get(async_resource_name).value; + if (typeof asyncResourceName === 'symbol') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + asyncResourceName = String(asyncResourceName); + var resource_name = envObject.ensureHandleId(asyncResourceName); + // tsfn create + var sizeofTSFN = emnapiTSFN.offset.end; + var tsfn = _malloc(sizeofTSFN); + if (!tsfn) + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + new Uint8Array(wasmMemory.buffer) + .subarray(tsfn, tsfn + sizeofTSFN) + .fill(0); + var resourceRef = emnapiCtx.createReference( + envObject, + resource, + 1, + 1 /* Ownership.kUserland */, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var resource_ = resourceRef.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(tsfn, resource_, true); + if (!emnapiTSFN.initQueue(tsfn)) { + _free(tsfn); + resourceRef.dispose(); + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + _emnapi_node_emit_async_init( + resource, + resource_name, + -1, + tsfn + emnapiTSFN.offset.async_id, + ); + HEAP_DATA_VIEW.setUint32( + tsfn + emnapiTSFN.offset.thread_count, + initial_thread_count, + true, + ); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.context, context, true); + HEAP_DATA_VIEW.setUint32( + tsfn + emnapiTSFN.offset.max_queue_size, + max_queue_size, + true, + ); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.ref, ref, true); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.env, env, true); + HEAP_DATA_VIEW.setInt32( + tsfn + emnapiTSFN.offset.finalize_data, + thread_finalize_data, + true, + ); + HEAP_DATA_VIEW.setInt32( + tsfn + emnapiTSFN.offset.finalize_cb, + thread_finalize_cb, + true, + ); + HEAP_DATA_VIEW.setInt32( + tsfn + emnapiTSFN.offset.call_js_cb, + call_js_cb, + true, + ); + emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn); + envObject.ref(); + emnapiCtx.increaseWaitingRequestCounter(); + HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.async_ref, 1, true); + HEAP_DATA_VIEW.setInt32(result, tsfn, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_threadsafe_function_context(func, result) { + if (!func || !result) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var context = emnapiTSFN.getContext(func); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, context, true); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ippi */ + function napi_call_threadsafe_function(func, data, mode) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + return emnapiTSFN.push(func, data, mode); + } + /** @__sig ip */ + function napi_acquire_threadsafe_function(func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var mutex = emnapiTSFN.getMutex(func); + return mutex.execute(function () { + if (emnapiTSFN.getIsClosing(func)) { + return 16 /* napi_status.napi_closing */; + } + emnapiTSFN.addThreadCount(func); + return 0 /* napi_status.napi_ok */; + }); + } + /** @__sig ipi */ + function napi_release_threadsafe_function(func, mode) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var mutex = emnapiTSFN.getMutex(func); + var cond = emnapiTSFN.getCond(func); + return mutex.execute(function () { + if (emnapiTSFN.getThreadCount(func) === 0) { + return 1 /* napi_status.napi_invalid_arg */; + } + emnapiTSFN.subThreadCount(func); + if ( + emnapiTSFN.getThreadCount(func) === 0 || + mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */ + ) { + var isClosing = emnapiTSFN.getIsClosing(func); + if (!isClosing) { + var isClosingValue = + mode === + 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */ + ? 1 + : 0; + emnapiTSFN.setIsClosing(func, isClosingValue); + if (isClosingValue && emnapiTSFN.getMaxQueueSize(func) > 0) { + cond.signal(); + } + emnapiTSFN.send(func); + } + } + return 0 /* napi_status.napi_ok */; + }); + } + /** @__sig ipp */ + function napi_unref_threadsafe_function(env, func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 0); + emnapiCtx.decreaseWaitingRequestCounter(); + } + return 0 /* napi_status.napi_ok */; + } + /** @__sig ipp */ + function napi_ref_threadsafe_function(env, func) { + if (!func) { + abort(); + return 1 /* napi_status.napi_invalid_arg */; + } + var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; + var arr = new Int32Array(wasmMemory.buffer); + if (!Atomics.load(arr, asyncRefOffset)) { + Atomics.store(arr, asyncRefOffset, 1); + emnapiCtx.increaseWaitingRequestCounter(); + } + return 0 /* napi_status.napi_ok */; + } + var emnapiAWMT = { + unusedWorkers: [], + runningWorkers: [], + workQueue: [], + workerReady: null, + offset: { + /* napi_ref */ resource: 0, + /* double */ async_id: 8, + /* double */ trigger_async_id: 16, + /* napi_env */ env: 24, + /* void* */ data: 1 * 4 + 24, + /* napi_async_execute_callback */ execute: 2 * 4 + 24, + /* napi_async_complete_callback */ complete: 3 * 4 + 24, + end: 4 * 4 + 24, + }, + init: function () { + emnapiAWMT.unusedWorkers = []; + emnapiAWMT.runningWorkers = []; + emnapiAWMT.workQueue = []; + emnapiAWMT.workerReady = null; + }, + addListener: function (worker) { + if (!worker) return false; + if (worker._emnapiAWMTListener) return true; + var handler = function (e) { + var data = e.data; + var __emnapi__ = data.__emnapi__; + if (__emnapi__) { + var type = __emnapi__.type; + var payload = __emnapi__.payload; + if (type === 'async-work-complete') { + emnapiCtx.decreaseWaitingRequestCounter(); + emnapiAWMT.runningWorkers.splice( + emnapiAWMT.runningWorkers.indexOf(worker), + 1, + ); + emnapiAWMT.unusedWorkers.push(worker); + emnapiAWMT.checkIdleWorker(); + emnapiAWMT.callComplete( + payload.work, + 0 /* napi_status.napi_ok */, + ); + } else if (type === 'async-work-queue') { + emnapiAWMT.scheduleWork(payload.work); + } else if (type === 'async-work-cancel') { + emnapiAWMT.cancelWork(payload.work); + } + } + }; + var dispose = function () { + { + worker.removeEventListener('message', handler, false); + } + delete worker._emnapiAWMTListener; + }; + worker._emnapiAWMTListener = { handler: handler, dispose: dispose }; + { + worker.addEventListener('message', handler, false); + } + return true; + }, + initWorkers: function (n) { + if (ENVIRONMENT_IS_PTHREAD) { + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + return ( + emnapiAWMT.workerReady || + (emnapiAWMT.workerReady = Promise.resolve()) + ); + } + if (emnapiAWMT.workerReady) return emnapiAWMT.workerReady; + if (typeof onCreateWorker !== 'function') { + throw new TypeError('`options.onCreateWorker` is not a function'); + } + var promises = []; + var args = []; + if (!('emnapi_async_worker_create' in wasmInstance.exports)) { + throw new TypeError( + '`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags', + ); + } + for (var i = 0; i < n; ++i) { + args.push(wasmInstance.exports.emnapi_async_worker_create()); + } + try { + var _loop_1 = function (i) { + var worker = onCreateWorker({ type: 'async-work' }); + var p = PThread.loadWasmModuleToWorker(worker); + emnapiAWMT.addListener(worker); + promises.push( + p.then(function () { + if (typeof worker.unref === 'function') { + worker.unref(); + } + }), + ); + emnapiAWMT.unusedWorkers.push(worker); + var arg = args[i]; + worker.threadBlockBase = arg; + worker.postMessage({ + __emnapi__: { + type: 'async-worker-init', + payload: { arg: arg }, + }, + }); + }; + for (var i = 0; i < n; ++i) { + _loop_1(i); + } + } catch (err) { + for (var i = 0; i < n; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var arg = args[i]; + _free(arg); + } + throw err; + } + emnapiAWMT.workerReady = Promise.all(promises); + return emnapiAWMT.workerReady; + }, + checkIdleWorker: function () { + if ( + emnapiAWMT.unusedWorkers.length > 0 && + emnapiAWMT.workQueue.length > 0 + ) { + var worker = emnapiAWMT.unusedWorkers.shift(); + var work = emnapiAWMT.workQueue.shift(); + emnapiAWMT.runningWorkers.push(worker); + worker.postMessage({ + __emnapi__: { + type: 'async-work-execute', + payload: { work: work }, }, - dispatchOne: function (func) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var data = 0; - var popped_value = false; - var has_more = false; - var mutex = emnapiTSFN.getMutex(func); - var cond = emnapiTSFN.getCond(func); - mutex.execute(function () { - if (emnapiTSFN.getIsClosing(func)) { - emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); - } - else { - var size = emnapiTSFN.getQueueSize(func); - if (size > 0) { - data = emnapiTSFN.shiftQueue(func); - popped_value = true; - var maxQueueSize = emnapiTSFN.getMaxQueueSize(func); - if (size === maxQueueSize && maxQueueSize > 0) { - cond.signal(); - } - size--; - } - if (size === 0) { - if (emnapiTSFN.getThreadCount(func) === 0) { - emnapiTSFN.setIsClosing(func, 1); - if (emnapiTSFN.getMaxQueueSize(func) > 0) { - cond.signal(); - } - emnapiTSFN.closeHandlesAndMaybeDelete(func, 0); - } - } - else { - has_more = true; - } - } - }); - if (popped_value) { - var env = emnapiTSFN.getEnv(func); - var envObject_1 = emnapiCtx.envStore.get(env); - emnapiCtx.openScope(envObject_1); - var f = function () { - envObject_1.callbackIntoModule(false, function () { - var callJsCb = emnapiTSFN.getCallJSCb(func); - var ref = emnapiTSFN.getRef(func); - var js_callback = ref ? emnapiCtx.refStore.get(ref).get() : 0; - if (callJsCb) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var context = emnapiTSFN.getContext(func); - (wasmTable.get(callJsCb))(env, js_callback, context, data); - } - else { - var jsCallback = js_callback ? emnapiCtx.handleStore.get(js_callback).value : null; - if (typeof jsCallback === 'function') { - jsCallback(); - } - } - }); - }; - try { - if (emnapiNodeBinding) { - var resource = emnapiTSFN.getResource(func); - var resource_value = emnapiCtx.refStore.get(resource).get(); - var resourceObject = emnapiCtx.handleStore.get(resource_value).value; - var view = new DataView(wasmMemory.buffer); - emnapiNodeBinding.node.makeCallback(resourceObject, f, [], { - asyncId: view.getFloat64(func + emnapiTSFN.offset.async_id, true), - triggerAsyncId: view.getFloat64(func + emnapiTSFN.offset.trigger_async_id, true) - }); - } - else { - f(); - } - } - finally { - emnapiCtx.closeScope(envObject_1); - } - } - return has_more; + }); + } + }, + getResource: function (work) { + return emnapiTSFN.loadSizeTypeValue( + work + emnapiAWMT.offset.resource, + false, + ); + }, + getExecute: function (work) { + return emnapiTSFN.loadSizeTypeValue( + work + emnapiAWMT.offset.execute, + false, + ); + }, + getComplete: function (work) { + return emnapiTSFN.loadSizeTypeValue( + work + emnapiAWMT.offset.complete, + false, + ); + }, + getEnv: function (work) { + return emnapiTSFN.loadSizeTypeValue( + work + emnapiAWMT.offset.env, + false, + ); + }, + getData: function (work) { + return emnapiTSFN.loadSizeTypeValue( + work + emnapiAWMT.offset.data, + false, + ); + }, + scheduleWork: function (work) { + var _a; + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_1 = napiModule.postMessage; + postMessage_1({ + __emnapi__: { + type: 'async-work-queue', + payload: { work: work }, }, - dispatch: function (func) { - var has_more = true; - var iterations_left = 1000; - var ui32a = new Uint32Array(wasmMemory.buffer); - var index = (func + emnapiTSFN.offset.dispatch_state) >> 2; - while (has_more && --iterations_left !== 0) { - Atomics.store(ui32a, index, 1); - has_more = emnapiTSFN.dispatchOne(func); - if (Atomics.exchange(ui32a, index, 0) !== 1) { - has_more = true; - } - } - if (has_more) { - emnapiTSFN.send(func); - } + }); + return; + } + emnapiCtx.increaseWaitingRequestCounter(); + emnapiAWMT.workQueue.push(work); + if ( + (_a = emnapiAWMT.workerReady) === null || _a === void 0 + ? void 0 + : _a.ready + ) { + emnapiAWMT.checkIdleWorker(); + } else { + var fail = function (err) { + emnapiCtx.decreaseWaitingRequestCounter(); + throw err; + }; + try { + emnapiAWMT + .initWorkers(_emnapi_async_work_pool_size()) + .then(function () { + emnapiAWMT.workerReady.ready = true; + emnapiAWMT.checkIdleWorker(); + }, fail); + } catch (err) { + fail(err); + } + } + }, + cancelWork: function (work) { + if (ENVIRONMENT_IS_PTHREAD) { + var postMessage_2 = napiModule.postMessage; + postMessage_2({ + __emnapi__: { + type: 'async-work-cancel', + payload: { work: work }, }, - send: function (func) { - var current_state = Atomics.or(new Uint32Array(wasmMemory.buffer), (func + emnapiTSFN.offset.dispatch_state) >> 2, 1 << 1); - if ((current_state & 1) === 1) { - return; - } - if ((typeof ENVIRONMENT_IS_PTHREAD !== 'undefined') && ENVIRONMENT_IS_PTHREAD) { - postMessage({ - __emnapi__: { - type: 'tsfn-send', - payload: { - tsfn: func - } - } - }); - } - else { - emnapiCtx.feature.setImmediate(function () { - emnapiTSFN.dispatch(func); - }); - } - } + }); + return 0 /* napi_status.napi_ok */; + } + var index = emnapiAWMT.workQueue.indexOf(work); + if (index !== -1) { + emnapiAWMT.workQueue.splice(index, 1); + emnapiCtx.feature.setImmediate(function () { + emnapiCtx.decreaseWaitingRequestCounter(); + emnapiAWMT.checkIdleWorker(); + emnapiAWMT.callComplete(work, 11 /* napi_status.napi_cancelled */); + }); + return 0 /* napi_status.napi_ok */; + } + return 9 /* napi_status.napi_generic_failure */; + }, + callComplete: function (work, status) { + var complete = emnapiAWMT.getComplete(work); + var env = emnapiAWMT.getEnv(work); + var data = emnapiAWMT.getData(work); + var envObject = emnapiCtx.envStore.get(env); + var scope = emnapiCtx.openScope(envObject); + var callback = function () { + if (!complete) return; + envObject.callbackIntoModule(true, function () { + wasmTable.get(complete)(env, status, data); + }); }; - /** @__sig ippppppppppp */ - function napi_create_threadsafe_function(env, func, async_resource, async_resource_name, max_queue_size, initial_thread_count, thread_finalize_data, thread_finalize_cb, context, call_js_cb, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!async_resource_name) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - max_queue_size = max_queue_size >>> 0; - initial_thread_count = initial_thread_count >>> 0; - if (initial_thread_count === 0) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var ref = 0; - if (!func) { - if (!call_js_cb) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - else { - var funcValue = emnapiCtx.handleStore.get(func).value; - if (typeof funcValue !== 'function') { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - ref = emnapiCtx.createReference(envObject, func, 1, 1 /* Ownership.kUserland */).id; - } - var asyncResourceObject; - if (async_resource) { - asyncResourceObject = emnapiCtx.handleStore.get(async_resource).value; - if (asyncResourceObject == null) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - asyncResourceObject = Object(asyncResourceObject); - } - else { - asyncResourceObject = {}; - } - var resource = envObject.ensureHandleId(asyncResourceObject); - var asyncResourceName = emnapiCtx.handleStore.get(async_resource_name).value; - if (typeof asyncResourceName === 'symbol') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - asyncResourceName = String(asyncResourceName); - var resource_name = envObject.ensureHandleId(asyncResourceName); - // tsfn create - var sizeofTSFN = emnapiTSFN.offset.end; - var tsfn = _malloc(sizeofTSFN); - if (!tsfn) - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - new Uint8Array(wasmMemory.buffer).subarray(tsfn, tsfn + sizeofTSFN).fill(0); - var resourceRef = emnapiCtx.createReference(envObject, resource, 1, 1 /* Ownership.kUserland */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var resource_ = resourceRef.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(tsfn, resource_, true); - if (!emnapiTSFN.initQueue(tsfn)) { - _free(tsfn); - resourceRef.dispose(); - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - _emnapi_node_emit_async_init(resource, resource_name, -1, tsfn + emnapiTSFN.offset.async_id); - HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.thread_count, initial_thread_count, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.context, context, true); - HEAP_DATA_VIEW.setUint32(tsfn + emnapiTSFN.offset.max_queue_size, max_queue_size, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.ref, ref, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.env, env, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_data, thread_finalize_data, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.finalize_cb, thread_finalize_cb, true); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.call_js_cb, call_js_cb, true); - emnapiCtx.addCleanupHook(envObject, emnapiTSFN.cleanup, tsfn); - envObject.ref(); - emnapiCtx.increaseWaitingRequestCounter(); - HEAP_DATA_VIEW.setInt32(tsfn + emnapiTSFN.offset.async_ref, 1, true); - HEAP_DATA_VIEW.setInt32(result, tsfn, true); + try { + if (emnapiNodeBinding) { + var resource = emnapiAWMT.getResource(work); + var resource_value = emnapiCtx.refStore.get(resource).get(); + var resourceObject = + emnapiCtx.handleStore.get(resource_value).value; + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64( + work + emnapiAWMT.offset.async_id, + true, + ); + var triggerAsyncId = view.getFloat64( + work + emnapiAWMT.offset.trigger_async_id, + true, + ); + emnapiNodeBinding.node.makeCallback(resourceObject, callback, [], { + asyncId: asyncId, + triggerAsyncId: triggerAsyncId, + }); + } else { + callback(); + } + } finally { + emnapiCtx.closeScope(envObject, scope); + } + }, + }; + /** @__sig ippppppp */ + var napi_create_async_work = singleThreadAsyncWork + ? function ( + env, + resource, + resource_name, + execute, + complete, + data, + result, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!execute) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceObject; + if (resource) { + resourceObject = Object(emnapiCtx.handleStore.get(resource).value); + } else { + resourceObject = {}; + } + if (!resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceName = String( + emnapiCtx.handleStore.get(resource_name).value, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var id = emnapiAWST.create( + env, + resourceObject, + resourceName, + execute, + complete, + data, + ); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, id, true); + return envObject.clearLastError(); + } + : function ( + env, + resource, + resource_name, + execute, + complete, + data, + result, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!execute) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resourceObject; + if (resource) { + resourceObject = Object(emnapiCtx.handleStore.get(resource).value); + } else { + resourceObject = {}; + } + if (!resource_name) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var sizeofAW = emnapiAWMT.offset.end; + var aw = _malloc(sizeofAW); + if (!aw) + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0); + var s = envObject.ensureHandleId(resourceObject); + var resourceRef = emnapiCtx.createReference( + envObject, + s, + 1, + 1 /* Ownership.kUserland */, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var resource_ = resourceRef.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(aw, resource_, true); + _emnapi_node_emit_async_init( + s, + resource_name, + -1, + aw + emnapiAWMT.offset.async_id, + ); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.env, env, true); + HEAP_DATA_VIEW.setInt32( + aw + emnapiAWMT.offset.execute, + execute, + true, + ); + HEAP_DATA_VIEW.setInt32( + aw + emnapiAWMT.offset.complete, + complete, + true, + ); + HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.data, data, true); + HEAP_DATA_VIEW.setInt32(result, aw, true); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_delete_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWST.remove(work); + return envObject.clearLastError(); + } + : function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var resource = emnapiAWMT.getResource(work); + emnapiCtx.refStore.get(resource).dispose(); + if (emnapiNodeBinding) { + var view = new DataView(wasmMemory.buffer); + var asyncId = view.getFloat64( + work + emnapiAWMT.offset.async_id, + true, + ); + var triggerAsyncId = view.getFloat64( + work + emnapiAWMT.offset.trigger_async_id, + true, + ); + _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); + } + _free(work); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_queue_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWST.queue(work); + return envObject.clearLastError(); + } + : function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiAWMT.scheduleWork(work); + return envObject.clearLastError(); + }; + /** @__sig ipp */ + var napi_cancel_async_work = singleThreadAsyncWork + ? function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = emnapiAWST.cancel(work); + if (status === 0 /* napi_status.napi_ok */) return envObject.clearLastError(); + return envObject.setLastError(status); + } + : function (env, work) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!work) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = emnapiAWMT.cancelWork(work); + if (status === 0 /* napi_status.napi_ok */) + return envObject.clearLastError(); + return envObject.setLastError(status); + }; + function initWorker(startArg) { + if (napiModule.childThread) { + if ( + typeof wasmInstance.exports.emnapi_async_worker_init !== 'function' + ) { + throw new TypeError( + '`emnapi_async_worker_init` is not exported, please try to add `--export=emnapi_async_worker_init` to linker flags', + ); + } + wasmInstance.exports.emnapi_async_worker_init(startArg); + } else { + throw new Error('startThread is only available in child threads'); + } + } + function executeAsyncWork(work) { + if (!ENVIRONMENT_IS_PTHREAD) return; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var execute = emnapiAWMT.getExecute(work); + var env = emnapiAWMT.getEnv(work); + var data = emnapiAWMT.getData(work); + wasmTable.get(execute)(env, data); + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'async-work-complete', + payload: { work: work }, + }, + }); + } + napiModule.initWorker = initWorker; + napiModule.executeAsyncWork = executeAsyncWork; + var asyncWorkMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_cancel_async_work: napi_cancel_async_work, + napi_create_async_work: napi_create_async_work, + napi_delete_async_work: napi_delete_async_work, + napi_queue_async_work: napi_queue_async_work, + }); + /** + * @__deps malloc + * @__deps free + * @__postset + * ``` + * emnapiExternalMemory.init(); + * ``` + */ + var emnapiExternalMemory = { + registry: + typeof FinalizationRegistry === 'function' + ? new FinalizationRegistry(function (_pointer) { + _free(_pointer); + }) + : undefined, + table: new WeakMap(), + wasmMemoryViewTable: new WeakMap(), + init: function () { + emnapiExternalMemory.registry = + typeof FinalizationRegistry === 'function' + ? new FinalizationRegistry(function (_pointer) { + _free(_pointer); + }) + : undefined; + emnapiExternalMemory.table = new WeakMap(); + emnapiExternalMemory.wasmMemoryViewTable = new WeakMap(); + }, + isDetachedArrayBuffer: function (arrayBuffer) { + if (arrayBuffer.byteLength === 0) { + try { + // eslint-disable-next-line no-new + new Uint8Array(arrayBuffer); + } catch (_) { + return true; + } } - /** @__sig ipp */ - function napi_get_threadsafe_function_context(func, result) { - if (!func || !result) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var context = emnapiTSFN.getContext(func); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, context, true); - return 0 /* napi_status.napi_ok */; - } - /** @__sig ippi */ - function napi_call_threadsafe_function(func, data, mode) { - if (!func) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - return emnapiTSFN.push(func, data, mode); - } - /** @__sig ip */ - function napi_acquire_threadsafe_function(func) { - if (!func) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - var mutex = emnapiTSFN.getMutex(func); - return mutex.execute(function () { - if (emnapiTSFN.getIsClosing(func)) { - return 16 /* napi_status.napi_closing */; - } - emnapiTSFN.addThreadCount(func); - return 0 /* napi_status.napi_ok */; + return false; + }, + getArrayBufferPointer: function (arrayBuffer, shouldCopy) { + var _a; + var info = { + address: 0, + ownership: 0 /* Ownership.kRuntime */, + runtimeAllocated: 0, + }; + if (arrayBuffer === wasmMemory.buffer) { + return info; + } + var isDetached = + emnapiExternalMemory.isDetachedArrayBuffer(arrayBuffer); + if (emnapiExternalMemory.table.has(arrayBuffer)) { + var cachedInfo = emnapiExternalMemory.table.get(arrayBuffer); + if (isDetached) { + cachedInfo.address = 0; + return cachedInfo; + } + if ( + shouldCopy && + cachedInfo.ownership === 0 /* Ownership.kRuntime */ && + cachedInfo.runtimeAllocated === 1 + ) { + new Uint8Array(wasmMemory.buffer).set( + new Uint8Array(arrayBuffer), + cachedInfo.address, + ); + } + return cachedInfo; + } + if (isDetached || arrayBuffer.byteLength === 0) { + return info; + } + if (!shouldCopy) { + return info; + } + var pointer = _malloc(arrayBuffer.byteLength); + if (!pointer) throw new Error('Out of memory'); + new Uint8Array(wasmMemory.buffer).set( + new Uint8Array(arrayBuffer), + pointer, + ); + info.address = pointer; + info.ownership = emnapiExternalMemory.registry + ? 0 /* Ownership.kRuntime */ + : 1 /* Ownership.kUserland */; + info.runtimeAllocated = 1; + emnapiExternalMemory.table.set(arrayBuffer, info); + (_a = emnapiExternalMemory.registry) === null || _a === void 0 + ? void 0 + : _a.register(arrayBuffer, pointer); + return info; + }, + getOrUpdateMemoryView: function (view) { + if (view.buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(view)) { + emnapiExternalMemory.wasmMemoryViewTable.set(view, { + Ctor: view.constructor, + address: view.byteOffset, + length: view instanceof DataView ? view.byteLength : view.length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }); + } + return view; + } + var maybeOldWasmMemory = + emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || + (typeof SharedArrayBuffer === 'function' && + view.buffer instanceof SharedArrayBuffer); + if ( + maybeOldWasmMemory && + emnapiExternalMemory.wasmMemoryViewTable.has(view) + ) { + var info = emnapiExternalMemory.wasmMemoryViewTable.get(view); + var Ctor = info.Ctor; + var newView = void 0; + var Buffer = emnapiCtx.feature.Buffer; + if (typeof Buffer === 'function' && Ctor === Buffer) { + newView = Buffer.from(wasmMemory.buffer, info.address, info.length); + } else { + newView = new Ctor(wasmMemory.buffer, info.address, info.length); + } + emnapiExternalMemory.wasmMemoryViewTable.set(newView, info); + return newView; + } + return view; + }, + getViewPointer: function (view, shouldCopy) { + view = emnapiExternalMemory.getOrUpdateMemoryView(view); + if (view.buffer === wasmMemory.buffer) { + if (emnapiExternalMemory.wasmMemoryViewTable.has(view)) { + var _a = emnapiExternalMemory.wasmMemoryViewTable.get(view), + address_1 = _a.address, + ownership_1 = _a.ownership, + runtimeAllocated_1 = _a.runtimeAllocated; + return { + address: address_1, + ownership: ownership_1, + runtimeAllocated: runtimeAllocated_1, + view: view, + }; + } + return { + address: view.byteOffset, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + view: view, + }; + } + var _b = emnapiExternalMemory.getArrayBufferPointer( + view.buffer, + shouldCopy, + ), + address = _b.address, + ownership = _b.ownership, + runtimeAllocated = _b.runtimeAllocated; + return { + address: address === 0 ? 0 : address + view.byteOffset, + ownership: ownership, + runtimeAllocated: runtimeAllocated, + view: view, + }; + }, + }; + /* eslint-disable @typescript-eslint/indent */ + /** + * @__postset + * ``` + * emnapiString.init(); + * ``` + */ + var emnapiString = { + utf8Decoder: undefined, + utf16Decoder: undefined, + init: function () { + var fallbackDecoder = { + decode: function (bytes) { + var inputIndex = 0; + var pendingSize = Math.min(0x1000, bytes.length + 1); + var pending = new Uint16Array(pendingSize); + var chunks = []; + var pendingIndex = 0; + for (;;) { + var more = inputIndex < bytes.length; + if (!more || pendingIndex >= pendingSize - 1) { + var subarray = pending.subarray(0, pendingIndex); + var arraylike = subarray; + chunks.push(String.fromCharCode.apply(null, arraylike)); + if (!more) { + return chunks.join(''); + } + bytes = bytes.subarray(inputIndex); + inputIndex = 0; + pendingIndex = 0; + } + var byte1 = bytes[inputIndex++]; + if ((byte1 & 0x80) === 0) { + pending[pendingIndex++] = byte1; + } else if ((byte1 & 0xe0) === 0xc0) { + var byte2 = bytes[inputIndex++] & 0x3f; + pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2; + } else if ((byte1 & 0xf0) === 0xe0) { + var byte2 = bytes[inputIndex++] & 0x3f; + var byte3 = bytes[inputIndex++] & 0x3f; + pending[pendingIndex++] = + ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3; + } else if ((byte1 & 0xf8) === 0xf0) { + var byte2 = bytes[inputIndex++] & 0x3f; + var byte3 = bytes[inputIndex++] & 0x3f; + var byte4 = bytes[inputIndex++] & 0x3f; + var codepoint = + ((byte1 & 0x07) << 0x12) | + (byte2 << 0x0c) | + (byte3 << 0x06) | + byte4; + if (codepoint > 0xffff) { + codepoint -= 0x10000; + pending[pendingIndex++] = + ((codepoint >>> 10) & 0x3ff) | 0xd800; + codepoint = 0xdc00 | (codepoint & 0x3ff); + } + pending[pendingIndex++] = codepoint; + } else; + } + }, + }; + var utf8Decoder; + utf8Decoder = + typeof TextDecoder === 'function' + ? new TextDecoder() + : fallbackDecoder; + emnapiString.utf8Decoder = utf8Decoder; + var fallbackDecoder2 = { + decode: function (input) { + var bytes = new Uint16Array( + input.buffer, + input.byteOffset, + input.byteLength / 2, + ); + if (bytes.length <= 0x1000) { + return String.fromCharCode.apply(null, bytes); + } + var chunks = []; + var i = 0; + var len = 0; + for (; i < bytes.length; i += len) { + len = Math.min(0x1000, bytes.length - i); + chunks.push( + String.fromCharCode.apply(null, bytes.subarray(i, i + len)), + ); + } + return chunks.join(''); + }, + }; + var utf16Decoder; + utf16Decoder = + typeof TextDecoder === 'function' + ? new TextDecoder('utf-16le') + : fallbackDecoder2; + emnapiString.utf16Decoder = utf16Decoder; + }, + lengthBytesUTF8: function (str) { + var c; + var len = 0; + for (var i = 0; i < str.length; ++i) { + c = str.charCodeAt(i); + if (c <= 0x7f) { + len++; + } else if (c <= 0x7ff) { + len += 2; + } else if (c >= 0xd800 && c <= 0xdfff) { + len += 4; + ++i; + } else { + len += 3; + } + } + return len; + }, + UTF8ToString: function (ptr, length) { + if (!ptr || !length) return ''; + ptr >>>= 0; + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + var end = ptr; + if (length === -1) { + for (; HEAPU8[end]; ) ++end; + } else { + end = ptr + (length >>> 0); + } + length = end - ptr; + if (length <= 16) { + var idx = ptr; + var str = ''; + while (idx < end) { + var u0 = HEAPU8[idx++]; + if (!(u0 & 0x80)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = HEAPU8[idx++] & 63; + if ((u0 & 0xe0) === 0xc0) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = HEAPU8[idx++] & 63; + if ((u0 & 0xf0) === 0xe0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + u0 = + ((u0 & 7) << 18) | + (u1 << 12) | + (u2 << 6) | + (HEAPU8[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; } - /** @__sig ipi */ - function napi_release_threadsafe_function(func, mode) { - if (!func) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - var mutex = emnapiTSFN.getMutex(func); - var cond = emnapiTSFN.getCond(func); - return mutex.execute(function () { - if (emnapiTSFN.getThreadCount(func) === 0) { - return 1 /* napi_status.napi_invalid_arg */; - } - emnapiTSFN.subThreadCount(func); - if (emnapiTSFN.getThreadCount(func) === 0 || mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) { - var isClosing = emnapiTSFN.getIsClosing(func); - if (!isClosing) { - var isClosingValue = (mode === 1 /* napi_threadsafe_function_release_mode.napi_tsfn_abort */) ? 1 : 0; - emnapiTSFN.setIsClosing(func, isClosingValue); - if (isClosingValue && emnapiTSFN.getMaxQueueSize(func) > 0) { - cond.signal(); - } - emnapiTSFN.send(func); - } - } - return 0 /* napi_status.napi_ok */; - }); + + var decodeFromSharedBuffer = (sharedBuffer) => { + var decoder = new TextDecoder(); + var copyLength = sharedBuffer.byteLength; + + var tempBuffer = new ArrayBuffer(copyLength); + var tempView = new Uint8Array(tempBuffer); + + var sharedView = new Uint8Array(sharedBuffer); + if (sharedBuffer.byteLength != copyLength) { + sharedView = sharedView.subarray(0, copyLength); + } + tempView.set(sharedView); + + return decoder.decode(tempBuffer); + }; + return decodeFromSharedBuffer( + (typeof SharedArrayBuffer === 'function' && + HEAPU8.buffer instanceof SharedArrayBuffer) || + Object.prototype.toString.call(HEAPU8.buffer.constructor) === + '[object SharedArrayBuffer]' + ? HEAPU8.slice(ptr, end) + : HEAPU8.subarray(ptr, end), + ); + }, + stringToUTF8: function (str, outPtr, maxBytesToWrite) { + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + var outIdx = outPtr; + outIdx >>>= 0; + if (!(maxBytesToWrite > 0)) { + return 0; + } + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 0xd800 && u <= 0xdfff) { + var u1 = str.charCodeAt(++i); + u = (0x10000 + ((u & 0x3ff) << 10)) | (u1 & 0x3ff); + } + if (u <= 0x7f) { + if (outIdx >= endIdx) break; + HEAPU8[outIdx++] = u; + } else if (u <= 0x7ff) { + if (outIdx + 1 >= endIdx) break; + HEAPU8[outIdx++] = 0xc0 | (u >> 6); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xffff) { + if (outIdx + 2 >= endIdx) break; + HEAPU8[outIdx++] = 0xe0 | (u >> 12); + HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + HEAPU8[outIdx++] = 0xf0 | (u >> 18); + HEAPU8[outIdx++] = 0x80 | ((u >> 12) & 63); + HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); + HEAPU8[outIdx++] = 0x80 | (u & 63); + } + } + HEAPU8[outIdx] = 0; + return outIdx - startIdx; + }, + UTF16ToString: function (ptr, length) { + if (!ptr || !length) return ''; + ptr >>>= 0; + var end = ptr; + if (length === -1) { + var idx = end >> 1; + var HEAPU16 = new Uint16Array(wasmMemory.buffer); + while (HEAPU16[idx]) ++idx; + end = idx << 1; + } else { + end = ptr + (length >>> 0) * 2; + } + length = end - ptr; + if (length <= 32) { + return String.fromCharCode.apply( + null, + new Uint16Array(wasmMemory.buffer, ptr, length / 2), + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var HEAPU8 = new Uint8Array(wasmMemory.buffer); + return emnapiString.utf16Decoder.decode( + (typeof SharedArrayBuffer === 'function' && + HEAPU8.buffer instanceof SharedArrayBuffer) || + Object.prototype.toString.call(HEAPU8.buffer.constructor) === + '[object SharedArrayBuffer]' + ? HEAPU8.slice(ptr, end) + : HEAPU8.subarray(ptr, end), + ); + }, + stringToUTF16: function (str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7fffffff; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = + maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < numCharsToWrite; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var codeUnit = str.charCodeAt(i); + HEAP_DATA_VIEW.setInt16(outPtr, codeUnit, true); + outPtr += 2; + } + HEAP_DATA_VIEW.setInt16(outPtr, 0, true); + return outPtr - startPtr; + }, + newString: function (env, str, length, result, stringMaker) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!str) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!(autoLength || sizelength <= 2147483647)) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var strValue = stringMaker(str, autoLength, sizelength); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(strValue).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + }, + newExternalString: function ( + env, + str, + length, + finalize_callback, + finalize_hint, + result, + copied, + createApi, + stringMaker, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!str) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!(autoLength || sizelength <= 2147483647)) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var status = createApi(env, str, length, result); + if (status === 0 /* napi_status.napi_ok */) { + if (copied) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(copied, 1, true); + } + if (finalize_callback) { + envObject.callFinalizer(finalize_callback, str, finalize_hint); + } + } + return status; + }, + }; + /** + * @__sig ippp + */ + function napi_get_array_length(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isArray()) { + return envObject.setLastError( + 8 /* napi_status.napi_array_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = handle.value.length >>> 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppp + */ + function napi_get_arraybuffer_info(env, arraybuffer, data, byte_length) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(arraybuffer); + if (!handle.isArrayBuffer()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getArrayBufferPointer( + handle.value, + true, + ).address; + HEAP_DATA_VIEW.setInt32(data, p, true); + } + if (byte_length) { + HEAP_DATA_VIEW.setUint32(byte_length, handle.value.byteLength, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_prototype(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = + handle.isObject() || handle.isFunction() + ? handle.value + : Object(handle.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = envObject.ensureHandleId(Object.getPrototypeOf(v)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, p, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ippppppp + */ + function napi_get_typedarray_info( + env, + typedarray, + type, + length, + data, + arraybuffer, + byte_offset, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!typedarray) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(typedarray); + if (!handle.isTypedArray()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (type) { + var t = void 0; + if (v instanceof Int8Array) { + t = 0 /* napi_typedarray_type.napi_int8_array */; + } else if (v instanceof Uint8Array) { + t = 1 /* napi_typedarray_type.napi_uint8_array */; + } else if (v instanceof Uint8ClampedArray) { + t = 2 /* napi_typedarray_type.napi_uint8_clamped_array */; + } else if (v instanceof Int16Array) { + t = 3 /* napi_typedarray_type.napi_int16_array */; + } else if (v instanceof Uint16Array) { + t = 4 /* napi_typedarray_type.napi_uint16_array */; + } else if (v instanceof Int32Array) { + t = 5 /* napi_typedarray_type.napi_int32_array */; + } else if (v instanceof Uint32Array) { + t = 6 /* napi_typedarray_type.napi_uint32_array */; + } else if (v instanceof Float32Array) { + t = 7 /* napi_typedarray_type.napi_float32_array */; + } else if (v instanceof Float64Array) { + t = 8 /* napi_typedarray_type.napi_float64_array */; + } else if (v instanceof BigInt64Array) { + t = 9 /* napi_typedarray_type.napi_bigint64_array */; + } else if (v instanceof BigUint64Array) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + t = 10 /* napi_typedarray_type.napi_biguint64_array */; + } else { + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + HEAP_DATA_VIEW.setInt32(type, t, true); + } + if (length) { + HEAP_DATA_VIEW.setUint32(length, v.length, true); + } + var buffer; + if (data || arraybuffer) { + buffer = v.buffer; + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getViewPointer(v, true).address; + HEAP_DATA_VIEW.setInt32(data, p, true); } - /** @__sig ipp */ - function napi_unref_threadsafe_function(env, func) { - if (!func) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; - var arr = new Int32Array(wasmMemory.buffer); - if (Atomics.load(arr, asyncRefOffset)) { - Atomics.store(arr, asyncRefOffset, 0); - emnapiCtx.decreaseWaitingRequestCounter(); - } - return 0 /* napi_status.napi_ok */; + if (arraybuffer) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ab = envObject.ensureHandleId(buffer); + HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); + } + } + if (byte_offset) { + HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_buffer_info(env, buffer, data, length) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!buffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(buffer); + if (!handle.isBuffer()) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0); + } + /** + * @__sig ipppppp + */ + function napi_get_dataview_info( + env, + dataview, + byte_length, + data, + arraybuffer, + byte_offset, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!dataview) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(dataview); + if (!handle.isDataView()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (byte_length) { + HEAP_DATA_VIEW.setUint32(byte_length, v.byteLength, true); + } + var buffer; + if (data || arraybuffer) { + buffer = v.buffer; + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getViewPointer(v, true).address; + HEAP_DATA_VIEW.setInt32(data, p, true); } - /** @__sig ipp */ - function napi_ref_threadsafe_function(env, func) { - if (!func) { - abort(); - return 1 /* napi_status.napi_invalid_arg */; - } - var asyncRefOffset = (func + emnapiTSFN.offset.async_ref) >> 2; - var arr = new Int32Array(wasmMemory.buffer); - if (!Atomics.load(arr, asyncRefOffset)) { - Atomics.store(arr, asyncRefOffset, 1); - emnapiCtx.increaseWaitingRequestCounter(); - } - return 0 /* napi_status.napi_ok */; + if (arraybuffer) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ab = envObject.ensureHandleId(buffer); + HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); + } + } + if (byte_offset) { + HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_date_value(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isDate()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + v = handle.value.valueOf(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ippp + */ + function napi_get_value_bool(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'boolean') { + return envObject.setLastError( + 7 /* napi_status.napi_boolean_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = handle.value ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_double(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setFloat64(result, r, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_value_bigint_int64(env, value, result, lossless) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!lossless) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + var numberValue = handle.value; + if (typeof numberValue !== 'bigint') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if ( + numberValue >= BigInt(-1) * (BigInt(1) << BigInt(63)) && + numberValue < BigInt(1) << BigInt(63) + ) { + HEAP_DATA_VIEW.setInt8(lossless, 1, true); + } else { + HEAP_DATA_VIEW.setInt8(lossless, 0, true); + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + if (numberValue >= BigInt(1) << BigInt(63)) { + numberValue = numberValue - (BigInt(1) << BigInt(64)); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + HEAP_DATA_VIEW.setInt32(result, low, true); + HEAP_DATA_VIEW.setInt32(result + 4, high, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_get_value_bigint_uint64(env, value, result, lossless) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!lossless) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + var numberValue = handle.value; + if (typeof numberValue !== 'bigint') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (numberValue >= BigInt(0) && numberValue < BigInt(1) << BigInt(64)) { + HEAP_DATA_VIEW.setInt8(lossless, 1, true); + } else { + HEAP_DATA_VIEW.setInt8(lossless, 0, true); + numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(numberValue & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(numberValue >> BigInt(32)); + HEAP_DATA_VIEW.setUint32(result, low, true); + HEAP_DATA_VIEW.setUint32(result + 4, high, true); + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_bigint_words( + env, + value, + sign_bit, + word_count, + words, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!word_count) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isBigInt()) { + return envObject.setLastError( + 17 /* napi_status.napi_bigint_expected */, + ); + } + var isMinus = handle.value < BigInt(0); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var word_count_int = HEAP_DATA_VIEW.getUint32(word_count, true); + var wordCount = 0; + var bigintValue = isMinus ? handle.value * BigInt(-1) : handle.value; + while (bigintValue !== BigInt(0)) { + wordCount++; + bigintValue = bigintValue >> BigInt(64); + } + bigintValue = isMinus ? handle.value * BigInt(-1) : handle.value; + if (!sign_bit && !words) { + word_count_int = wordCount; + HEAP_DATA_VIEW.setUint32(word_count, word_count_int, true); + } else { + if (!sign_bit) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!words) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var wordsArr = []; + while (bigintValue !== BigInt(0)) { + var uint64 = bigintValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); + wordsArr.push(uint64); + bigintValue = bigintValue >> BigInt(64); + } + var len = Math.min(word_count_int, wordsArr.length); + for (var i = 0; i < len; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var low = Number(wordsArr[i] & BigInt(0xffffffff)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var high = Number(wordsArr[i] >> BigInt(32)); + HEAP_DATA_VIEW.setUint32(words + i * 8, low, true); + HEAP_DATA_VIEW.setUint32(words + i * 8 + 4, high, true); + } + HEAP_DATA_VIEW.setInt32(sign_bit, isMinus ? 1 : 0, true); + HEAP_DATA_VIEW.setUint32(word_count, len, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_external(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (!handle.isExternal()) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = handle.data(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, p, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_int32(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = new Int32Array([handle.value])[0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_int64(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + var numberValue = handle.value; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if ( + numberValue === Number.POSITIVE_INFINITY || + numberValue === Number.NEGATIVE_INFINITY || + isNaN(numberValue) + ) { + HEAP_DATA_VIEW.setInt32(result, 0, true); + HEAP_DATA_VIEW.setInt32(result + 4, 0, true); + } else if ( + numberValue < /* INT64_RANGE_NEGATIVE */ -9223372036854776000 + ) { + HEAP_DATA_VIEW.setInt32(result, 0, true); + HEAP_DATA_VIEW.setInt32(result + 4, 0x80000000, true); + } else if ( + numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000 + ) { + HEAP_DATA_VIEW.setUint32(result, 0xffffffff, true); + HEAP_DATA_VIEW.setUint32(result + 4, 0x7fffffff, true); + } else { + $emnapiSetValueI64(result, Math.trunc(numberValue)); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_latin1(env, value, buf, buf_size, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); + } else if (buf_size !== 0) { + var copied = 0; + var v = void 0; + for (var i = 0; i < buf_size - 1; ++i) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = handle.value.charCodeAt(i) & 0xff; + HEAP_DATA_VIEW.setUint8(buf + i, v, true); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + copied++; } - var emnapiAWMT = { - unusedWorkers: [], - runningWorkers: [], - workQueue: [], - workerReady: null, - offset: { - /* napi_ref */ resource: 0, - /* double */ async_id: 8, - /* double */ trigger_async_id: 16, - /* napi_env */ env: 24, - /* void* */ data: 1 * 4 + 24, - /* napi_async_execute_callback */ execute: 2 * 4 + 24, - /* napi_async_complete_callback */ complete: 3 * 4 + 24, - end: 4 * 4 + 24 - }, - init: function () { - emnapiAWMT.unusedWorkers = []; - emnapiAWMT.runningWorkers = []; - emnapiAWMT.workQueue = []; - emnapiAWMT.workerReady = null; - }, - addListener: function (worker) { - if (!worker) - return false; - if (worker._emnapiAWMTListener) - return true; - var handler = function (e) { - var data = e.data; - var __emnapi__ = data.__emnapi__; - if (__emnapi__) { - var type = __emnapi__.type; - var payload = __emnapi__.payload; - if (type === 'async-work-complete') { - emnapiCtx.decreaseWaitingRequestCounter(); - emnapiAWMT.runningWorkers.splice(emnapiAWMT.runningWorkers.indexOf(worker), 1); - emnapiAWMT.unusedWorkers.push(worker); - emnapiAWMT.checkIdleWorker(); - emnapiAWMT.callComplete(payload.work, 0 /* napi_status.napi_ok */); - } - else if (type === 'async-work-queue') { - emnapiAWMT.scheduleWork(payload.work); - } - else if (type === 'async-work-cancel') { - emnapiAWMT.cancelWork(payload.work); - } - } - }; - var dispose = function () { - { - worker.removeEventListener('message', handler, false); - } - delete worker._emnapiAWMTListener; - }; - worker._emnapiAWMTListener = { handler: handler, dispose: dispose }; - { - worker.addEventListener('message', handler, false); - } - return true; - }, - initWorkers: function (n) { - if (ENVIRONMENT_IS_PTHREAD) { - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - return emnapiAWMT.workerReady || (emnapiAWMT.workerReady = Promise.resolve()); - } - if (emnapiAWMT.workerReady) - return emnapiAWMT.workerReady; - if (typeof onCreateWorker !== 'function') { - throw new TypeError('`options.onCreateWorker` is not a function'); - } - var promises = []; - var args = []; - if (!('emnapi_async_worker_create' in wasmInstance.exports)) { - throw new TypeError('`emnapi_async_worker_create` is not exported, please try to add `--export=emnapi_async_worker_create` to linker flags'); - } - for (var i = 0; i < n; ++i) { - args.push(wasmInstance.exports.emnapi_async_worker_create()); - } - try { - var _loop_1 = function (i) { - var worker = onCreateWorker({ type: 'async-work' }); - var p = PThread.loadWasmModuleToWorker(worker); - emnapiAWMT.addListener(worker); - promises.push(p.then(function () { - if (typeof worker.unref === 'function') { - worker.unref(); - } - })); - emnapiAWMT.unusedWorkers.push(worker); - var arg = args[i]; - worker.threadBlockBase = arg; - worker.postMessage({ - __emnapi__: { - type: 'async-worker-init', - payload: { arg: arg } - } - }); - }; - for (var i = 0; i < n; ++i) { - _loop_1(i); - } - } - catch (err) { - for (var i = 0; i < n; ++i) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var arg = args[i]; - _free(arg); - } - throw err; - } - emnapiAWMT.workerReady = Promise.all(promises); - return emnapiAWMT.workerReady; - }, - checkIdleWorker: function () { - if (emnapiAWMT.unusedWorkers.length > 0 && emnapiAWMT.workQueue.length > 0) { - var worker = emnapiAWMT.unusedWorkers.shift(); - var work = emnapiAWMT.workQueue.shift(); - emnapiAWMT.runningWorkers.push(worker); - worker.postMessage({ - __emnapi__: { - type: 'async-work-execute', - payload: { work: work } - } - }); - } - }, - getResource: function (work) { - return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.resource, false); - }, - getExecute: function (work) { - return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.execute, false); - }, - getComplete: function (work) { - return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.complete, false); - }, - getEnv: function (work) { - return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.env, false); - }, - getData: function (work) { - return emnapiTSFN.loadSizeTypeValue(work + emnapiAWMT.offset.data, false); - }, - scheduleWork: function (work) { - var _a; - if (ENVIRONMENT_IS_PTHREAD) { - var postMessage_1 = napiModule.postMessage; - postMessage_1({ - __emnapi__: { - type: 'async-work-queue', - payload: { work: work } - } - }); - return; - } - emnapiCtx.increaseWaitingRequestCounter(); - emnapiAWMT.workQueue.push(work); - if ((_a = emnapiAWMT.workerReady) === null || _a === void 0 ? void 0 : _a.ready) { - emnapiAWMT.checkIdleWorker(); - } - else { - var fail = function (err) { - emnapiCtx.decreaseWaitingRequestCounter(); - throw err; - }; - try { - emnapiAWMT.initWorkers(_emnapi_async_work_pool_size()).then(function () { - emnapiAWMT.workerReady.ready = true; - emnapiAWMT.checkIdleWorker(); - }, fail); - } - catch (err) { - fail(err); - } - } - }, - cancelWork: function (work) { - if (ENVIRONMENT_IS_PTHREAD) { - var postMessage_2 = napiModule.postMessage; - postMessage_2({ - __emnapi__: { - type: 'async-work-cancel', - payload: { work: work } - } - }); - return 0 /* napi_status.napi_ok */; - } - var index = emnapiAWMT.workQueue.indexOf(work); - if (index !== -1) { - emnapiAWMT.workQueue.splice(index, 1); - emnapiCtx.feature.setImmediate(function () { - emnapiCtx.decreaseWaitingRequestCounter(); - emnapiAWMT.checkIdleWorker(); - emnapiAWMT.callComplete(work, 11 /* napi_status.napi_cancelled */); - }); - return 0 /* napi_status.napi_ok */; - } - return 9 /* napi_status.napi_generic_failure */; - }, - callComplete: function (work, status) { - var complete = emnapiAWMT.getComplete(work); - var env = emnapiAWMT.getEnv(work); - var data = emnapiAWMT.getData(work); - var envObject = emnapiCtx.envStore.get(env); - var scope = emnapiCtx.openScope(envObject); - var callback = function () { - if (!complete) - return; - envObject.callbackIntoModule(true, function () { - (wasmTable.get(complete))(env, status, data); - }); - }; - try { - if (emnapiNodeBinding) { - var resource = emnapiAWMT.getResource(work); - var resource_value = emnapiCtx.refStore.get(resource).get(); - var resourceObject = emnapiCtx.handleStore.get(resource_value).value; - var view = new DataView(wasmMemory.buffer); - var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true); - var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true); - emnapiNodeBinding.node.makeCallback(resourceObject, callback, [], { - asyncId: asyncId, - triggerAsyncId: triggerAsyncId - }); - } - else { - callback(); - } - } - finally { - emnapiCtx.closeScope(envObject, scope); - } - } + HEAP_DATA_VIEW.setUint8(buf + copied, 0, true); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied, true); + } + } else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_utf8(env, value, buf, buf_size, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var strLength = emnapiString.lengthBytesUTF8(handle.value); + HEAP_DATA_VIEW.setUint32(result, strLength, true); + } else if (buf_size !== 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var copied = emnapiString.stringToUTF8(handle.value, buf, buf_size); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied, true); + } + } else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippppp + */ + function napi_get_value_string_utf16(env, value, buf, buf_size, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + buf_size = buf_size >>> 0; + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!buf) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); + } else if (buf_size !== 0) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var copied = emnapiString.stringToUTF16( + handle.value, + buf, + buf_size * 2, + ); + if (result) { + HEAP_DATA_VIEW.setUint32(result, copied / 2, true); + } + } else if (result) { + HEAP_DATA_VIEW.setUint32(result, 0, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_get_value_uint32(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (typeof handle.value !== 'number') { + return envObject.setLastError(6 /* napi_status.napi_number_expected */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = new Uint32Array([handle.value])[0]; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, v, true); + return envObject.clearLastError(); + } + var convert2cMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_array_length: napi_get_array_length, + napi_get_arraybuffer_info: napi_get_arraybuffer_info, + napi_get_buffer_info: napi_get_buffer_info, + napi_get_dataview_info: napi_get_dataview_info, + napi_get_date_value: napi_get_date_value, + napi_get_prototype: napi_get_prototype, + napi_get_typedarray_info: napi_get_typedarray_info, + napi_get_value_bigint_int64: napi_get_value_bigint_int64, + napi_get_value_bigint_uint64: napi_get_value_bigint_uint64, + napi_get_value_bigint_words: napi_get_value_bigint_words, + napi_get_value_bool: napi_get_value_bool, + napi_get_value_double: napi_get_value_double, + napi_get_value_external: napi_get_value_external, + napi_get_value_int32: napi_get_value_int32, + napi_get_value_int64: napi_get_value_int64, + napi_get_value_string_latin1: napi_get_value_string_latin1, + napi_get_value_string_utf16: napi_get_value_string_utf16, + napi_get_value_string_utf8: napi_get_value_string_utf8, + napi_get_value_uint32: napi_get_value_uint32, + }); + /** + * @__sig ipip + */ + function napi_create_int32(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipip + */ + function napi_create_uint32(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value >>> 0).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipjp + */ + function napi_create_int64(env, low, high, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = Number(low); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipdp + */ + function napi_create_double(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function napi_create_string_latin1(env, str, length, result) { + return emnapiString.newString( + env, + str, + length, + result, + function (str, autoLength, sizeLength) { + var latin1String = ''; + var len = 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (autoLength) { + while (true) { + var ch = HEAP_DATA_VIEW.getUint8(str, true); + if (!ch) break; + latin1String += String.fromCharCode(ch); + str++; + } + } else { + while (len < sizeLength) { + var ch = HEAP_DATA_VIEW.getUint8(str, true); + if (!ch) break; + latin1String += String.fromCharCode(ch); + len++; + str++; + } + } + return latin1String; + }, + ); + } + /** + * @__sig ipppp + */ + function napi_create_string_utf16(env, str, length, result) { + return emnapiString.newString(env, str, length, result, function (str) { + return emnapiString.UTF16ToString(str, length); + }); + } + /** + * @__sig ipppp + */ + function napi_create_string_utf8(env, str, length, result) { + return emnapiString.newString(env, str, length, result, function (str) { + return emnapiString.UTF8ToString(str, length); + }); + } + /** + * @__sig ippppppp + */ + function node_api_create_external_string_latin1( + env, + str, + length, + finalize_callback, + finalize_hint, + result, + copied, + ) { + return emnapiString.newExternalString( + env, + str, + length, + finalize_callback, + finalize_hint, + result, + copied, + napi_create_string_latin1, + undefined, + ); + } + /** + * @__sig ippppppp + */ + function node_api_create_external_string_utf16( + env, + str, + length, + finalize_callback, + finalize_hint, + result, + copied, + ) { + return emnapiString.newExternalString( + env, + str, + length, + finalize_callback, + finalize_hint, + result, + copied, + napi_create_string_utf16, + undefined, + ); + } + /** + * @__sig ipppp + */ + function node_api_create_property_key_utf16(env, str, length, result) { + return napi_create_string_utf16(env, str, length, result); + } + /** + * @__sig ipjp + */ + function napi_create_bigint_int64(env, low, high, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = low; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipjp + */ + function napi_create_bigint_uint64(env, low, high, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + var value; + if (!high) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + value = low & ((BigInt(1) << BigInt(64)) - BigInt(1)); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v1 = emnapiCtx.addToCurrentScope(value).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(high, v1, true); + return envObject.clearLastError(); + } + /** + * @__sig ipippp + */ + function napi_create_bigint_words( + env, + sign_bit, + word_count, + words, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v, i; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!emnapiCtx.feature.supportBigInt) { + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + word_count = word_count >>> 0; + if (word_count > 2147483647) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (word_count > (1024 * 1024) / (4 * 8) / 2) { + throw new RangeError('Maximum BigInt size exceeded'); + } + var value = BigInt(0); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (i = 0; i < word_count; i++) { + var low = HEAP_DATA_VIEW.getUint32(words + i * 8, true); + var high = HEAP_DATA_VIEW.getUint32(words + i * 8 + 4, true); + var wordi = BigInt(low) | (BigInt(high) << BigInt(32)); + value += wordi << BigInt(64 * i); + } + value *= + BigInt(sign_bit) % BigInt(2) === BigInt(0) ? BigInt(1) : BigInt(-1); + v = emnapiCtx.addToCurrentScope(value).id; + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + var convert2napiMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_bigint_int64: napi_create_bigint_int64, + napi_create_bigint_uint64: napi_create_bigint_uint64, + napi_create_bigint_words: napi_create_bigint_words, + napi_create_double: napi_create_double, + napi_create_int32: napi_create_int32, + napi_create_int64: napi_create_int64, + napi_create_string_latin1: napi_create_string_latin1, + napi_create_string_utf16: napi_create_string_utf16, + napi_create_string_utf8: napi_create_string_utf8, + napi_create_uint32: napi_create_uint32, + node_api_create_external_string_latin1: + node_api_create_external_string_latin1, + node_api_create_external_string_utf16: + node_api_create_external_string_utf16, + node_api_create_property_key_utf16: node_api_create_property_key_utf16, + }); + function emnapiCreateFunction(envObject, utf8name, length, cb, data) { + var functionName = + !utf8name || !length ? '' : emnapiString.UTF8ToString(utf8name, length); + var f; + var makeFunction = function () { + return function () { + var cbinfo = emnapiCtx.cbinfoStack.push(this, data, arguments, f); + var scope = emnapiCtx.openScope(envObject); + try { + return envObject.callIntoModule(function (envObject) { + var napiValue = wasmTable.get(cb)(envObject.id, cbinfo); + return !napiValue + ? undefined + : emnapiCtx.handleStore.get(napiValue).value; + }); + } finally { + emnapiCtx.cbinfoStack.pop(); + emnapiCtx.closeScope(envObject, scope); + } }; - /** @__sig ippppppp */ - var napi_create_async_work = singleThreadAsyncWork - ? function (env, resource, resource_name, execute, complete, data, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!execute) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var resourceObject; - if (resource) { - resourceObject = Object(emnapiCtx.handleStore.get(resource).value); - } - else { - resourceObject = {}; - } - if (!resource_name) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var resourceName = String(emnapiCtx.handleStore.get(resource_name).value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var id = emnapiAWST.create(env, resourceObject, resourceName, execute, complete, data); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, id, true); - return envObject.clearLastError(); - } - : function (env, resource, resource_name, execute, complete, data, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!execute) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var resourceObject; - if (resource) { - resourceObject = Object(emnapiCtx.handleStore.get(resource).value); - } - else { - resourceObject = {}; - } - if (!resource_name) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var sizeofAW = emnapiAWMT.offset.end; - var aw = _malloc(sizeofAW); - if (!aw) - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - new Uint8Array(wasmMemory.buffer).subarray(aw, aw + sizeofAW).fill(0); - var s = envObject.ensureHandleId(resourceObject); - var resourceRef = emnapiCtx.createReference(envObject, s, 1, 1 /* Ownership.kUserland */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var resource_ = resourceRef.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(aw, resource_, true); - _emnapi_node_emit_async_init(s, resource_name, -1, aw + emnapiAWMT.offset.async_id); - HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.env, env, true); - HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.execute, execute, true); - HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.complete, complete, true); - HEAP_DATA_VIEW.setInt32(aw + emnapiAWMT.offset.data, data, true); - HEAP_DATA_VIEW.setInt32(result, aw, true); - return envObject.clearLastError(); + }; + if (functionName === '') { + f = makeFunction(); + return { status: 0 /* napi_status.napi_ok */, f: f }; + } + if (!/^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(functionName)) { + return { status: 1 /* napi_status.napi_invalid_arg */, f: undefined }; + } + if (emnapiCtx.feature.supportNewFunction) { + var _ = makeFunction(); + try { + f = new Function( + '_', + 'return function ' + + functionName + + '(){' + + '"use strict";' + + 'return _.apply(this,arguments);' + + '};', + )(_); + } catch (_err) { + f = makeFunction(); + if (emnapiCtx.feature.canSetFunctionName) + Object.defineProperty(f, 'name', { value: functionName }); + } + } else { + f = makeFunction(); + if (emnapiCtx.feature.canSetFunctionName) + Object.defineProperty(f, 'name', { value: functionName }); + } + return { status: 0 /* napi_status.napi_ok */, f: f }; + } + function emnapiDefineProperty( + envObject, + obj, + propertyName, + method, + getter, + setter, + value, + attributes, + data, + ) { + if (getter || setter) { + var localGetter = void 0; + var localSetter = void 0; + if (getter) { + localGetter = emnapiCreateFunction(envObject, 0, 0, getter, data).f; + } + if (setter) { + localSetter = emnapiCreateFunction(envObject, 0, 0, setter, data).f; + } + var desc = { + configurable: + (attributes & + 4) /* napi_property_attributes.napi_configurable */ !== + 0, + enumerable: + (attributes & 2) /* napi_property_attributes.napi_enumerable */ !== + 0, + get: localGetter, + set: localSetter, + }; + Object.defineProperty(obj, propertyName, desc); + } else if (method) { + var localMethod = emnapiCreateFunction(envObject, 0, 0, method, data).f; + var desc = { + configurable: + (attributes & + 4) /* napi_property_attributes.napi_configurable */ !== + 0, + enumerable: + (attributes & 2) /* napi_property_attributes.napi_enumerable */ !== + 0, + writable: + (attributes & 1) /* napi_property_attributes.napi_writable */ !== 0, + value: localMethod, + }; + Object.defineProperty(obj, propertyName, desc); + } else { + var desc = { + configurable: + (attributes & + 4) /* napi_property_attributes.napi_configurable */ !== + 0, + enumerable: + (attributes & 2) /* napi_property_attributes.napi_enumerable */ !== + 0, + writable: + (attributes & 1) /* napi_property_attributes.napi_writable */ !== 0, + value: emnapiCtx.handleStore.get(value).value, + }; + Object.defineProperty(obj, propertyName, desc); + } + } + function emnapiGetHandle(js_object) { + var handle = emnapiCtx.handleStore.get(js_object); + if (!(handle.isObject() || handle.isFunction())) { + return { status: 1 /* napi_status.napi_invalid_arg */ }; + } + if ( + typeof emnapiExternalMemory !== 'undefined' && + ArrayBuffer.isView(handle.value) + ) { + if (emnapiExternalMemory.wasmMemoryViewTable.has(handle.value)) { + handle = emnapiCtx.addToCurrentScope( + emnapiExternalMemory.wasmMemoryViewTable.get(handle.value), + ); + } + } + return { status: 0 /* napi_status.napi_ok */, handle: handle }; + } + function emnapiWrap( + env, + js_object, + native_object, + finalize_cb, + finalize_hint, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var referenceId; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!emnapiCtx.feature.supportFinalizer) { + if (finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError( + 'napi_wrap', + 'Parameter "finalize_cb" must be 0(NULL)', + ); + } + if (result) { + throw emnapiCtx.createNotSupportWeakRefError( + 'napi_wrap', + 'Parameter "result" must be 0(NULL)', + ); + } + } + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handleResult = emnapiGetHandle(js_object); + if (handleResult.status !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(handleResult.status); + } + var handle = handleResult.handle; + if (envObject.getObjectBinding(handle.value).wrapped !== 0) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var reference = void 0; + if (result) { + if (!finalize_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + reference = emnapiCtx.createReference( + envObject, + handle.id, + 0, + 1 /* Ownership.kUserland */, + finalize_cb, + native_object, + finalize_hint, + ); + referenceId = reference.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, referenceId, true); + } else { + reference = emnapiCtx.createReference( + envObject, + handle.id, + 0, + 0 /* Ownership.kRuntime */, + finalize_cb, + native_object, + !finalize_cb ? finalize_cb : finalize_hint, + ); + } + envObject.getObjectBinding(handle.value).wrapped = reference.id; + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + function emnapiUnwrap(env, js_object, result, action) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var data; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (action === 0 /* UnwrapAction.KeepWrap */) { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var value = emnapiCtx.handleStore.get(js_object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var binding = envObject.getObjectBinding(value.value); + var referenceId = binding.wrapped; + var ref = emnapiCtx.refStore.get(referenceId); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + data = ref.data(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, data, true); + } + if (action === 1 /* UnwrapAction.RemoveWrap */) { + binding.wrapped = 0; + if (ref.ownership() === 1 /* Ownership.kUserland */) { + // When the wrap is been removed, the finalizer should be reset. + ref.resetFinalizer(); + } else { + ref.dispose(); + } + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppppppp + */ + function napi_define_class( + env, + utf8name, + length, + constructor, + callback_data, + property_count, + properties, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var propPtr, valueHandleId, attributes; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + property_count = property_count >>> 0; + if (property_count > 0) { + if (!properties) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (length < -1 || length > 2147483647 || !utf8name) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var fresult = emnapiCreateFunction( + envObject, + utf8name, + length, + constructor, + callback_data, + ); + if (fresult.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(fresult.status); + var F = fresult.f; + var propertyName = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < property_count; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + propPtr = properties + i * (4 * 8); + var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); + var name_1 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); + var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); + var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); + var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); + var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); + attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); + var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); + if (utf8Name) { + propertyName = emnapiString.UTF8ToString(utf8Name, -1); + } else { + if (!name_1) { + return envObject.setLastError( + 4 /* napi_status.napi_name_expected */, + ); + } + propertyName = emnapiCtx.handleStore.get(name_1).value; + if ( + typeof propertyName !== 'string' && + typeof propertyName !== 'symbol' + ) { + return envObject.setLastError( + 4 /* napi_status.napi_name_expected */, + ); + } + } + if ( + (attributes & 1024) /* napi_property_attributes.napi_static */ !== + 0 + ) { + emnapiDefineProperty( + envObject, + F, + propertyName, + method, + getter, + setter, + value, + attributes, + data, + ); + continue; + } + emnapiDefineProperty( + envObject, + F.prototype, + propertyName, + method, + getter, + setter, + value, + attributes, + data, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var valueHandle = emnapiCtx.addToCurrentScope(F); + valueHandleId = valueHandle.id; + HEAP_DATA_VIEW.setInt32(result, valueHandleId, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppppp + */ + function napi_wrap( + env, + js_object, + native_object, + finalize_cb, + finalize_hint, + result, + ) { + return emnapiWrap( + env, + js_object, + native_object, + finalize_cb, + finalize_hint, + result, + ); + } + /** + * @__sig ippp + */ + function napi_unwrap(env, js_object, result) { + return emnapiUnwrap( + env, + js_object, + result, + 0 /* UnwrapAction.KeepWrap */, + ); + } + /** + * @__sig ippp + */ + function napi_remove_wrap(env, js_object, result) { + return emnapiUnwrap( + env, + js_object, + result, + 1 /* UnwrapAction.RemoveWrap */, + ); + } + /** + * @__sig ippp + */ + function napi_type_tag_object(env, object, type_tag) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + var value = emnapiCtx.handleStore.get(object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 2 /* napi_status.napi_object_expected */, + ); + } + if (!type_tag) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + var binding = envObject.getObjectBinding(value.value); + if (binding.tag !== null) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + var tag = new Uint8Array(16); + tag.set(new Uint8Array(wasmMemory.buffer, type_tag, 16)); + binding.tag = new Uint32Array(tag.buffer); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppp + */ + function napi_check_object_type_tag(env, object, type_tag, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, one-var + var ret = true; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + var value = emnapiCtx.handleStore.get(object); + if (!(value.isObject() || value.isFunction())) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 2 /* napi_status.napi_object_expected */, + ); + } + if (!type_tag) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + if (!result) { + return envObject.setLastError( + envObject.tryCatch.hasCaught() + ? 10 /* napi_status.napi_pending_exception */ + : 1 /* napi_status.napi_invalid_arg */, + ); + } + var binding = envObject.getObjectBinding(value.value); + if (binding.tag !== null) { + var tag = binding.tag; + var typeTag = new Uint32Array(wasmMemory.buffer, type_tag, 4); + ret = + tag[0] === typeTag[0] && + tag[1] === typeTag[1] && + tag[2] === typeTag[2] && + tag[3] === typeTag[3]; + } else { + ret = false; + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, ret ? 1 : 0, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppppp + */ + function napi_add_finalizer( + env, + js_object, + finalize_data, + finalize_cb, + finalize_hint, + result, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!emnapiCtx.feature.supportFinalizer) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + if (!js_object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!finalize_cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handleResult = emnapiGetHandle(js_object); + if (handleResult.status !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(handleResult.status); + } + var handle = handleResult.handle; + var ownership = !result + ? 0 /* Ownership.kRuntime */ + : 1; /* Ownership.kUserland */ + var reference = emnapiCtx.createReference( + envObject, + handle.id, + 0, + ownership, + finalize_cb, + finalize_data, + finalize_hint, + ); + if (result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var referenceId = reference.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, referenceId, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipppp + */ + function node_api_post_finalizer( + env, + finalize_cb, + finalize_data, + finalize_hint, + ) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + envObject.enqueueFinalizer( + emnapiCtx.createTrackedFinalizer( + envObject, + finalize_cb, + finalize_data, + finalize_hint, + ), + ); + return envObject.clearLastError(); + } + var wrapMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_add_finalizer: napi_add_finalizer, + napi_check_object_type_tag: napi_check_object_type_tag, + napi_define_class: napi_define_class, + napi_remove_wrap: napi_remove_wrap, + napi_type_tag_object: napi_type_tag_object, + napi_unwrap: napi_unwrap, + napi_wrap: napi_wrap, + node_api_post_finalizer: node_api_post_finalizer, + }); + /** + * @__sig ipippppp + */ + function emnapi_create_memory_view( + env, + typedarray_type, + external_data, + byte_length, + finalize_cb, + finalize_hint, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + if (!external_data) { + byte_length = 0; + } + if (byte_length > 2147483647) { + throw new RangeError( + 'Cannot create a memory view larger than 2147483647 bytes', + ); + } + if (external_data + byte_length > wasmMemory.buffer.byteLength) { + throw new RangeError('Memory out of range'); + } + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError( + 'emnapi_create_memory_view', + 'Parameter "finalize_cb" must be 0(NULL)', + ); + } + var viewDescriptor = void 0; + switch (typedarray_type) { + case 0 /* emnapi_memory_view_type.emnapi_int8_array */: + viewDescriptor = { + Ctor: Int8Array, + address: external_data, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }; - /** @__sig ipp */ - var napi_delete_async_work = singleThreadAsyncWork - ? function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiAWST.remove(work); - return envObject.clearLastError(); - } - : function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var resource = emnapiAWMT.getResource(work); - emnapiCtx.refStore.get(resource).dispose(); - if (emnapiNodeBinding) { - var view = new DataView(wasmMemory.buffer); - var asyncId = view.getFloat64(work + emnapiAWMT.offset.async_id, true); - var triggerAsyncId = view.getFloat64(work + emnapiAWMT.offset.trigger_async_id, true); - _emnapi_node_emit_async_destroy(asyncId, triggerAsyncId); - } - _free(work); - return envObject.clearLastError(); + break; + case 1 /* emnapi_memory_view_type.emnapi_uint8_array */: + viewDescriptor = { + Ctor: Uint8Array, + address: external_data, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }; - /** @__sig ipp */ - var napi_queue_async_work = singleThreadAsyncWork - ? function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiAWST.queue(work); - return envObject.clearLastError(); - } - : function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiAWMT.scheduleWork(work); - return envObject.clearLastError(); + break; + case 2 /* emnapi_memory_view_type.emnapi_uint8_clamped_array */: + viewDescriptor = { + Ctor: Uint8ClampedArray, + address: external_data, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }; - /** @__sig ipp */ - var napi_cancel_async_work = singleThreadAsyncWork - ? function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var status = emnapiAWST.cancel(work); - if (status === 0 /* napi_status.napi_ok */) - return envObject.clearLastError(); - return envObject.setLastError(status); - } - : function (env, work) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!work) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var status = emnapiAWMT.cancelWork(work); - if (status === 0 /* napi_status.napi_ok */) - return envObject.clearLastError(); - return envObject.setLastError(status); + break; + case 3 /* emnapi_memory_view_type.emnapi_int16_array */: + viewDescriptor = { + Ctor: Int16Array, + address: external_data, + length: byte_length >> 1, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }; - function initWorker(startArg) { - if (napiModule.childThread) { - if (typeof wasmInstance.exports.emnapi_async_worker_init !== 'function') { - throw new TypeError('`emnapi_async_worker_init` is not exported, please try to add `--export=emnapi_async_worker_init` to linker flags'); - } - wasmInstance.exports.emnapi_async_worker_init(startArg); - } - else { - throw new Error('startThread is only available in child threads'); - } - } - function executeAsyncWork(work) { - if (!ENVIRONMENT_IS_PTHREAD) - return; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var execute = emnapiAWMT.getExecute(work); - var env = emnapiAWMT.getEnv(work); - var data = emnapiAWMT.getData(work); - (wasmTable.get(execute))(env, data); - var postMessage = napiModule.postMessage; - postMessage({ - __emnapi__: { - type: 'async-work-complete', - payload: { work: work } - } - }); - } - napiModule.initWorker = initWorker; - napiModule.executeAsyncWork = executeAsyncWork; - var asyncWorkMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_cancel_async_work: napi_cancel_async_work, - napi_create_async_work: napi_create_async_work, - napi_delete_async_work: napi_delete_async_work, - napi_queue_async_work: napi_queue_async_work - }); - /** - * @__deps malloc - * @__deps free - * @__postset - * ``` - * emnapiExternalMemory.init(); - * ``` - */ - var emnapiExternalMemory = { - registry: typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined, - table: new WeakMap(), - wasmMemoryViewTable: new WeakMap(), - init: function () { - emnapiExternalMemory.registry = typeof FinalizationRegistry === 'function' ? new FinalizationRegistry(function (_pointer) { _free(_pointer); }) : undefined; - emnapiExternalMemory.table = new WeakMap(); - emnapiExternalMemory.wasmMemoryViewTable = new WeakMap(); - }, - isDetachedArrayBuffer: function (arrayBuffer) { - if (arrayBuffer.byteLength === 0) { - try { - // eslint-disable-next-line no-new - new Uint8Array(arrayBuffer); - } - catch (_) { - return true; - } - } - return false; - }, - getArrayBufferPointer: function (arrayBuffer, shouldCopy) { - var _a; - var info = { - address: 0, - ownership: 0 /* Ownership.kRuntime */, - runtimeAllocated: 0 - }; - if (arrayBuffer === wasmMemory.buffer) { - return info; - } - var isDetached = emnapiExternalMemory.isDetachedArrayBuffer(arrayBuffer); - if (emnapiExternalMemory.table.has(arrayBuffer)) { - var cachedInfo = emnapiExternalMemory.table.get(arrayBuffer); - if (isDetached) { - cachedInfo.address = 0; - return cachedInfo; - } - if (shouldCopy && cachedInfo.ownership === 0 /* Ownership.kRuntime */ && cachedInfo.runtimeAllocated === 1) { - new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), cachedInfo.address); - } - return cachedInfo; - } - if (isDetached || (arrayBuffer.byteLength === 0)) { - return info; - } - if (!shouldCopy) { - return info; - } - var pointer = _malloc(arrayBuffer.byteLength); - if (!pointer) - throw new Error('Out of memory'); - new Uint8Array(wasmMemory.buffer).set(new Uint8Array(arrayBuffer), pointer); - info.address = pointer; - info.ownership = emnapiExternalMemory.registry ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */; - info.runtimeAllocated = 1; - emnapiExternalMemory.table.set(arrayBuffer, info); - (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(arrayBuffer, pointer); - return info; - }, - getOrUpdateMemoryView: function (view) { - if (view.buffer === wasmMemory.buffer) { - if (!emnapiExternalMemory.wasmMemoryViewTable.has(view)) { - emnapiExternalMemory.wasmMemoryViewTable.set(view, { - Ctor: view.constructor, - address: view.byteOffset, - length: view instanceof DataView ? view.byteLength : view.length, - ownership: 1 /* Ownership.kUserland */, - runtimeAllocated: 0 - }); - } - return view; - } - var maybeOldWasmMemory = emnapiExternalMemory.isDetachedArrayBuffer(view.buffer) || - ((typeof SharedArrayBuffer === 'function') && (view.buffer instanceof SharedArrayBuffer)); - if (maybeOldWasmMemory && emnapiExternalMemory.wasmMemoryViewTable.has(view)) { - var info = emnapiExternalMemory.wasmMemoryViewTable.get(view); - var Ctor = info.Ctor; - var newView = void 0; - var Buffer = emnapiCtx.feature.Buffer; - if (typeof Buffer === 'function' && Ctor === Buffer) { - newView = Buffer.from(wasmMemory.buffer, info.address, info.length); - } - else { - newView = new Ctor(wasmMemory.buffer, info.address, info.length); - } - emnapiExternalMemory.wasmMemoryViewTable.set(newView, info); - return newView; - } - return view; - }, - getViewPointer: function (view, shouldCopy) { - view = emnapiExternalMemory.getOrUpdateMemoryView(view); - if (view.buffer === wasmMemory.buffer) { - if (emnapiExternalMemory.wasmMemoryViewTable.has(view)) { - var _a = emnapiExternalMemory.wasmMemoryViewTable.get(view), address_1 = _a.address, ownership_1 = _a.ownership, runtimeAllocated_1 = _a.runtimeAllocated; - return { address: address_1, ownership: ownership_1, runtimeAllocated: runtimeAllocated_1, view: view }; - } - return { address: view.byteOffset, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0, view: view }; - } - var _b = emnapiExternalMemory.getArrayBufferPointer(view.buffer, shouldCopy), address = _b.address, ownership = _b.ownership, runtimeAllocated = _b.runtimeAllocated; - return { address: address === 0 ? 0 : (address + view.byteOffset), ownership: ownership, runtimeAllocated: runtimeAllocated, view: view }; - } - }; - /* eslint-disable @typescript-eslint/indent */ - /** - * @__postset - * ``` - * emnapiString.init(); - * ``` - */ - var emnapiString = { - utf8Decoder: undefined, - utf16Decoder: undefined, - init: function () { - var fallbackDecoder = { - decode: function (bytes) { - var inputIndex = 0; - var pendingSize = Math.min(0x1000, bytes.length + 1); - var pending = new Uint16Array(pendingSize); - var chunks = []; - var pendingIndex = 0; - for (; ;) { - var more = inputIndex < bytes.length; - if (!more || (pendingIndex >= pendingSize - 1)) { - var subarray = pending.subarray(0, pendingIndex); - var arraylike = subarray; - chunks.push(String.fromCharCode.apply(null, arraylike)); - if (!more) { - return chunks.join(''); - } - bytes = bytes.subarray(inputIndex); - inputIndex = 0; - pendingIndex = 0; - } - var byte1 = bytes[inputIndex++]; - if ((byte1 & 0x80) === 0) { - pending[pendingIndex++] = byte1; - } - else if ((byte1 & 0xe0) === 0xc0) { - var byte2 = bytes[inputIndex++] & 0x3f; - pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2; - } - else if ((byte1 & 0xf0) === 0xe0) { - var byte2 = bytes[inputIndex++] & 0x3f; - var byte3 = bytes[inputIndex++] & 0x3f; - pending[pendingIndex++] = ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3; - } - else if ((byte1 & 0xf8) === 0xf0) { - var byte2 = bytes[inputIndex++] & 0x3f; - var byte3 = bytes[inputIndex++] & 0x3f; - var byte4 = bytes[inputIndex++] & 0x3f; - var codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4; - if (codepoint > 0xffff) { - codepoint -= 0x10000; - pending[pendingIndex++] = (codepoint >>> 10) & 0x3ff | 0xd800; - codepoint = 0xdc00 | codepoint & 0x3ff; - } - pending[pendingIndex++] = codepoint; - } - else; - } - } - }; - var utf8Decoder; - utf8Decoder = typeof TextDecoder === 'function' ? new TextDecoder() : fallbackDecoder; - emnapiString.utf8Decoder = utf8Decoder; - var fallbackDecoder2 = { - decode: function (input) { - var bytes = new Uint16Array(input.buffer, input.byteOffset, input.byteLength / 2); - if (bytes.length <= 0x1000) { - return String.fromCharCode.apply(null, bytes); - } - var chunks = []; - var i = 0; - var len = 0; - for (; i < bytes.length; i += len) { - len = Math.min(0x1000, bytes.length - i); - chunks.push(String.fromCharCode.apply(null, bytes.subarray(i, i + len))); - } - return chunks.join(''); - } - }; - var utf16Decoder; - utf16Decoder = typeof TextDecoder === 'function' ? new TextDecoder('utf-16le') : fallbackDecoder2; - emnapiString.utf16Decoder = utf16Decoder; - }, - lengthBytesUTF8: function (str) { - var c; - var len = 0; - for (var i = 0; i < str.length; ++i) { - c = str.charCodeAt(i); - if (c <= 0x7F) { - len++; - } - else if (c <= 0x7FF) { - len += 2; - } - else if (c >= 0xD800 && c <= 0xDFFF) { - len += 4; - ++i; - } - else { - len += 3; - } - } - return len; - }, - UTF8ToString: function (ptr, length) { - if (!ptr || !length) - return ''; - ptr >>>= 0; - var HEAPU8 = new Uint8Array(wasmMemory.buffer); - var end = ptr; - if (length === -1) { - for (; HEAPU8[end];) - ++end; - } - else { - end = ptr + (length >>> 0); - } - length = end - ptr; - if (length <= 16) { - var idx = ptr; - var str = ''; - while (idx < end) { - var u0 = HEAPU8[idx++]; - if (!(u0 & 0x80)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = HEAPU8[idx++] & 63; - if ((u0 & 0xE0) === 0xC0) { - str += String.fromCharCode(((u0 & 31) << 6) | u1); - continue; - } - var u2 = HEAPU8[idx++] & 63; - if ((u0 & 0xF0) === 0xE0) { - u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; - } - else { - u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (HEAPU8[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; - } - - var decodeFromSharedBuffer = (sharedBuffer) => { - var decoder = new TextDecoder() - var copyLength = sharedBuffer.byteLength - - var tempBuffer = new ArrayBuffer(copyLength) - var tempView = new Uint8Array(tempBuffer) - - var sharedView = new Uint8Array(sharedBuffer) - if (sharedBuffer.byteLength != copyLength) { - sharedView = sharedView.subarray(0, copyLength) - } - tempView.set(sharedView) - - return decoder.decode(tempBuffer) - } - return decodeFromSharedBuffer(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer.constructor) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end)); - }, - stringToUTF8: function (str, outPtr, maxBytesToWrite) { - var HEAPU8 = new Uint8Array(wasmMemory.buffer); - var outIdx = outPtr; - outIdx >>>= 0; - if (!(maxBytesToWrite > 0)) { - return 0; - } - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 0xD800 && u <= 0xDFFF) { - var u1 = str.charCodeAt(++i); - u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); - } - if (u <= 0x7F) { - if (outIdx >= endIdx) - break; - HEAPU8[outIdx++] = u; - } - else if (u <= 0x7FF) { - if (outIdx + 1 >= endIdx) - break; - HEAPU8[outIdx++] = 0xC0 | (u >> 6); - HEAPU8[outIdx++] = 0x80 | (u & 63); - } - else if (u <= 0xFFFF) { - if (outIdx + 2 >= endIdx) - break; - HEAPU8[outIdx++] = 0xE0 | (u >> 12); - HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); - HEAPU8[outIdx++] = 0x80 | (u & 63); - } - else { - if (outIdx + 3 >= endIdx) - break; - HEAPU8[outIdx++] = 0xF0 | (u >> 18); - HEAPU8[outIdx++] = 0x80 | ((u >> 12) & 63); - HEAPU8[outIdx++] = 0x80 | ((u >> 6) & 63); - HEAPU8[outIdx++] = 0x80 | (u & 63); - } - } - HEAPU8[outIdx] = 0; - return outIdx - startIdx; - }, - UTF16ToString: function (ptr, length) { - if (!ptr || !length) - return ''; - ptr >>>= 0; - var end = ptr; - if (length === -1) { - var idx = end >> 1; - var HEAPU16 = new Uint16Array(wasmMemory.buffer); - while (HEAPU16[idx]) - ++idx; - end = idx << 1; - } - else { - end = ptr + (length >>> 0) * 2; - } - length = end - ptr; - if (length <= 32) { - return String.fromCharCode.apply(null, new Uint16Array(wasmMemory.buffer, ptr, length / 2)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var HEAPU8 = new Uint8Array(wasmMemory.buffer); - return emnapiString.utf16Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer.constructor) === "[object SharedArrayBuffer]")) ? HEAPU8.slice(ptr, end) : HEAPU8.subarray(ptr, end)); - }, - stringToUTF16: function (str, outPtr, maxBytesToWrite) { - if (maxBytesToWrite === undefined) { - maxBytesToWrite = 0x7FFFFFFF; - } - if (maxBytesToWrite < 2) - return 0; - maxBytesToWrite -= 2; - var startPtr = outPtr; - var numCharsToWrite = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite / 2) : str.length; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (var i = 0; i < numCharsToWrite; ++i) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var codeUnit = str.charCodeAt(i); - HEAP_DATA_VIEW.setInt16(outPtr, codeUnit, true); - outPtr += 2; - } - HEAP_DATA_VIEW.setInt16(outPtr, 0, true); - return outPtr - startPtr; - }, - newString: function (env, str, length, result, stringMaker) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - var autoLength = length === -1; - var sizelength = length >>> 0; - if (length !== 0) { - if (!str) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!(autoLength || (sizelength <= 2147483647))) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var strValue = stringMaker(str, autoLength, sizelength); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(strValue).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - }, - newExternalString: function (env, str, length, finalize_callback, finalize_hint, result, copied, createApi, stringMaker) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - var autoLength = length === -1; - var sizelength = length >>> 0; - if (length !== 0) { - if (!str) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!(autoLength || (sizelength <= 2147483647))) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var status = createApi(env, str, length, result); - if (status === 0 /* napi_status.napi_ok */) { - if (copied) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(copied, 1, true); - } - if (finalize_callback) { - envObject.callFinalizer(finalize_callback, str, finalize_hint); - } - } - return status; - } - }; - /** - * @__sig ippp - */ - function napi_get_array_length(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + break; + case 4 /* emnapi_memory_view_type.emnapi_uint16_array */: + viewDescriptor = { + Ctor: Uint16Array, + address: external_data, + length: byte_length >> 1, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 5 /* emnapi_memory_view_type.emnapi_int32_array */: + viewDescriptor = { + Ctor: Int32Array, + address: external_data, + length: byte_length >> 2, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 6 /* emnapi_memory_view_type.emnapi_uint32_array */: + viewDescriptor = { + Ctor: Uint32Array, + address: external_data, + length: byte_length >> 2, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 7 /* emnapi_memory_view_type.emnapi_float32_array */: + viewDescriptor = { + Ctor: Float32Array, + address: external_data, + length: byte_length >> 2, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 8 /* emnapi_memory_view_type.emnapi_float64_array */: + viewDescriptor = { + Ctor: Float64Array, + address: external_data, + length: byte_length >> 3, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 9 /* emnapi_memory_view_type.emnapi_bigint64_array */: + viewDescriptor = { + Ctor: BigInt64Array, + address: external_data, + length: byte_length >> 3, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case 10 /* emnapi_memory_view_type.emnapi_biguint64_array */: + viewDescriptor = { + Ctor: BigUint64Array, + address: external_data, + length: byte_length >> 3, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case -1 /* emnapi_memory_view_type.emnapi_data_view */: + viewDescriptor = { + Ctor: DataView, + address: external_data, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + case -2 /* emnapi_memory_view_type.emnapi_buffer */: { + if (!emnapiCtx.feature.Buffer) { + throw emnapiCtx.createNotSupportBufferError( + 'emnapi_create_memory_view', + '', + ); + } + viewDescriptor = { + Ctor: emnapiCtx.feature.Buffer, + address: external_data, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }; + break; + } + default: + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var Ctor = viewDescriptor.Ctor; + var typedArray = + typedarray_type === -2 /* emnapi_memory_view_type.emnapi_buffer */ + ? emnapiCtx.feature.Buffer.from( + wasmMemory.buffer, + viewDescriptor.address, + viewDescriptor.length, + ) + : new Ctor( + wasmMemory.buffer, + viewDescriptor.address, + viewDescriptor.length, + ); + var handle = emnapiCtx.addToCurrentScope(typedArray); + emnapiExternalMemory.wasmMemoryViewTable.set( + typedArray, + viewDescriptor, + ); + if (finalize_cb) { + var status_1 = napi_add_finalizer( + env, + handle.id, + external_data, + finalize_cb, + finalize_hint, + /* NULL */ 0, + ); + if (status_1 === 10 /* napi_status.napi_pending_exception */) { + var err = envObject.tryCatch.extractException(); envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (!handle.isArray()) { - return envObject.setLastError(8 /* napi_status.napi_array_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = handle.value.length >>> 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppp - */ - function napi_get_arraybuffer_info(env, arraybuffer, data, byte_length) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!arraybuffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(arraybuffer); - if (!handle.isArrayBuffer()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = emnapiExternalMemory.getArrayBufferPointer(handle.value, true).address; - HEAP_DATA_VIEW.setInt32(data, p, true); - } - if (byte_length) { - HEAP_DATA_VIEW.setUint32(byte_length, handle.value.byteLength, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_prototype(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); + throw err; + } else if (status_1 !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(status_1); + } + } + value = handle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig i + */ + function emnapi_is_support_weakref() { + return emnapiCtx.feature.supportFinalizer ? 1 : 0; + } + /** + * @__sig i + */ + function emnapi_is_support_bigint() { + return emnapiCtx.feature.supportBigInt ? 1 : 0; + } + /** + * @__sig i + */ + function emnapi_is_node_binding_available() { + return emnapiNodeBinding ? 1 : 0; + } + function $emnapiSyncMemory(js_to_wasm, arrayBufferOrView, offset, len) { + offset = offset !== null && offset !== void 0 ? offset : 0; + offset = offset >>> 0; + var view; + if (arrayBufferOrView instanceof ArrayBuffer) { + var pointer = emnapiExternalMemory.getArrayBufferPointer( + arrayBufferOrView, + false, + ).address; + if (!pointer) throw new Error('Unknown ArrayBuffer address'); + if (typeof len !== 'number' || len === -1) { + len = arrayBufferOrView.byteLength - offset; + } + len = len >>> 0; + if (len === 0) return arrayBufferOrView; + view = new Uint8Array(arrayBufferOrView, offset, len); + var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); + if (!js_to_wasm) { + view.set(wasmMemoryU8.subarray(pointer, pointer + len)); + } else { + wasmMemoryU8.set(view, pointer); + } + return arrayBufferOrView; + } + if (ArrayBuffer.isView(arrayBufferOrView)) { + var viewPointerInfo = emnapiExternalMemory.getViewPointer( + arrayBufferOrView, + false, + ); + var latestView = viewPointerInfo.view; + var pointer = viewPointerInfo.address; + if (!pointer) throw new Error('Unknown ArrayBuffer address'); + if (typeof len !== 'number' || len === -1) { + len = latestView.byteLength - offset; + } + len = len >>> 0; + if (len === 0) return latestView; + view = new Uint8Array( + latestView.buffer, + latestView.byteOffset + offset, + len, + ); + var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); + if (!js_to_wasm) { + view.set(wasmMemoryU8.subarray(pointer, pointer + len)); + } else { + wasmMemoryU8.set(view, pointer); + } + return latestView; + } + throw new TypeError( + 'emnapiSyncMemory expect ArrayBuffer or ArrayBufferView as first parameter', + ); + } + /** + * @__sig ipippp + */ + function emnapi_sync_memory( + env, + js_to_wasm, + arraybuffer_or_view, + offset, + len, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!arraybuffer_or_view) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var handleId = HEAP_DATA_VIEW.getInt32(arraybuffer_or_view, true); + var handle = envObject.ctx.handleStore.get(handleId); + if ( + !handle.isArrayBuffer() && + !handle.isTypedArray() && + !handle.isDataView() + ) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var ret = $emnapiSyncMemory( + Boolean(js_to_wasm), + handle.value, + offset, + len, + ); + if (handle.value !== ret) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(arraybuffer_or_view, v, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + function $emnapiGetMemoryAddress(arrayBufferOrView) { + var isArrayBuffer = arrayBufferOrView instanceof ArrayBuffer; + var isDataView = arrayBufferOrView instanceof DataView; + var isTypedArray = ArrayBuffer.isView(arrayBufferOrView) && !isDataView; + if (!isArrayBuffer && !isTypedArray && !isDataView) { + throw new TypeError( + 'emnapiGetMemoryAddress expect ArrayBuffer or ArrayBufferView as first parameter', + ); + } + var info; + if (isArrayBuffer) { + info = emnapiExternalMemory.getArrayBufferPointer( + arrayBufferOrView, + false, + ); + } else { + info = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false); + } + return { + address: info.address, + ownership: info.ownership, + runtimeAllocated: info.runtimeAllocated, + }; + } + /** + * @__sig ipppp + */ + function emnapi_get_memory_address( + env, + arraybuffer_or_view, + address, + ownership, + runtime_allocated, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p, runtimeAllocated, ownershipOut; + var info; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!arraybuffer_or_view) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!address && !ownership && !runtime_allocated) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var handle = envObject.ctx.handleStore.get(arraybuffer_or_view); + info = $emnapiGetMemoryAddress(handle.value); + p = info.address; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (address) { + HEAP_DATA_VIEW.setInt32(address, p, true); + } + if (ownership) { + ownershipOut = info.ownership; + HEAP_DATA_VIEW.setInt32(ownership, ownershipOut, true); + } + if (runtime_allocated) { + runtimeAllocated = info.runtimeAllocated; + HEAP_DATA_VIEW.setInt8(runtime_allocated, runtimeAllocated, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipp + */ + function emnapi_get_runtime_version(env, version) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!version) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var runtimeVersion; + try { + runtimeVersion = emnapiCtx.getRuntimeVersions().version; + } catch (_) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var versions = runtimeVersion.split('.').map(function (n) { + return Number(n); + }); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(version, versions[0], true); + HEAP_DATA_VIEW.setUint32(version + 4, versions[1], true); + HEAP_DATA_VIEW.setUint32(version + 8, versions[2], true); + return envObject.clearLastError(); + } + var emnapiMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + $emnapiGetMemoryAddress: $emnapiGetMemoryAddress, + $emnapiSyncMemory: $emnapiSyncMemory, + emnapi_create_memory_view: emnapi_create_memory_view, + emnapi_get_memory_address: emnapi_get_memory_address, + emnapi_get_runtime_version: emnapi_get_runtime_version, + emnapi_is_node_binding_available: emnapi_is_node_binding_available, + emnapi_is_support_bigint: emnapi_is_support_bigint, + emnapi_is_support_weakref: emnapi_is_support_weakref, + emnapi_sync_memory: emnapi_sync_memory, + }); + /** + * @__sig ipp + */ + function napi_create_array(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope([]).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_create_array_with_length(env, length, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + length = length >>> 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(new Array(length)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + function emnapiCreateArrayBuffer(byte_length, data) { + byte_length = byte_length >>> 0; + var arrayBuffer = new ArrayBuffer(byte_length); + if (data) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var p = emnapiExternalMemory.getArrayBufferPointer( + arrayBuffer, + true, + ).address; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(data, p, true); + } + return arrayBuffer; + } + /** + * @__sig ipppp + */ + function napi_create_arraybuffer(env, byte_length, data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data); + value = emnapiCtx.addToCurrentScope(arrayBuffer).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipdp + */ + function napi_create_date(env, time, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(new Date(time)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ippppp + */ + function napi_create_external( + env, + data, + finalize_cb, + finalize_hint, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError( + 'napi_create_external', + 'Parameter "finalize_cb" must be 0(NULL)', + ); + } + var externalHandle = emnapiCtx + .getCurrentScope() + .addExternal(envObject, data); + if (finalize_cb) { + emnapiCtx.createReference( + envObject, + externalHandle.id, + 0, + 0 /* Ownership.kRuntime */, + finalize_cb, + data, + finalize_hint, + ); + } + value = externalHandle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppppp + */ + function napi_create_external_arraybuffer( + env, + external_data, + byte_length, + finalize_cb, + finalize_hint, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + if (!external_data) { + byte_length = 0; + } + if (external_data + byte_length > wasmMemory.buffer.byteLength) { + throw new RangeError('Memory out of range'); + } + if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { + throw emnapiCtx.createNotSupportWeakRefError( + 'napi_create_external_arraybuffer', + 'Parameter "finalize_cb" must be 0(NULL)', + ); + } + var arrayBuffer = new ArrayBuffer(byte_length); + if (byte_length === 0) { + try { + var MessageChannel_1 = emnapiCtx.feature.MessageChannel; + var messageChannel = new MessageChannel_1(); + messageChannel.port1.postMessage(arrayBuffer, [arrayBuffer]); + } catch (_) {} + } else { + var u8arr = new Uint8Array(arrayBuffer); + u8arr.set( + new Uint8Array(wasmMemory.buffer).subarray( + external_data, + external_data + byte_length, + ), + ); + emnapiExternalMemory.table.set(arrayBuffer, { + address: external_data, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }); + } + var handle = emnapiCtx.addToCurrentScope(arrayBuffer); + if (finalize_cb) { + var status_1 = napi_add_finalizer( + env, + handle.id, + external_data, + finalize_cb, + finalize_hint, + /* NULL */ 0, + ); + if (status_1 === 10 /* napi_status.napi_pending_exception */) { + var err = envObject.tryCatch.extractException(); envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (handle.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = handle.isObject() || handle.isFunction() ? handle.value : Object(handle.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = envObject.ensureHandleId(Object.getPrototypeOf(v)); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, p, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ippppppp - */ - function napi_get_typedarray_info(env, typedarray, type, length, data, arraybuffer, byte_offset) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!typedarray) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(typedarray); - if (!handle.isTypedArray()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var v = handle.value; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (type) { - var t = void 0; - if (v instanceof Int8Array) { - t = 0 /* napi_typedarray_type.napi_int8_array */; - } - else if (v instanceof Uint8Array) { - t = 1 /* napi_typedarray_type.napi_uint8_array */; - } - else if (v instanceof Uint8ClampedArray) { - t = 2 /* napi_typedarray_type.napi_uint8_clamped_array */; - } - else if (v instanceof Int16Array) { - t = 3 /* napi_typedarray_type.napi_int16_array */; - } - else if (v instanceof Uint16Array) { - t = 4 /* napi_typedarray_type.napi_uint16_array */; - } - else if (v instanceof Int32Array) { - t = 5 /* napi_typedarray_type.napi_int32_array */; - } - else if (v instanceof Uint32Array) { - t = 6 /* napi_typedarray_type.napi_uint32_array */; - } - else if (v instanceof Float32Array) { - t = 7 /* napi_typedarray_type.napi_float32_array */; - } - else if (v instanceof Float64Array) { - t = 8 /* napi_typedarray_type.napi_float64_array */; - } - else if (v instanceof BigInt64Array) { - t = 9 /* napi_typedarray_type.napi_bigint64_array */; - } - else if (v instanceof BigUint64Array) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - t = 10 /* napi_typedarray_type.napi_biguint64_array */; - } - else { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - HEAP_DATA_VIEW.setInt32(type, t, true); - } - if (length) { - HEAP_DATA_VIEW.setUint32(length, v.length, true); - } - var buffer; - if (data || arraybuffer) { - buffer = v.buffer; - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = emnapiExternalMemory.getViewPointer(v, true).address; - HEAP_DATA_VIEW.setInt32(data, p, true); - } - if (arraybuffer) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var ab = envObject.ensureHandleId(buffer); - HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); - } - } - if (byte_offset) { - HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ipppp - */ - function napi_get_buffer_info(env, buffer, data, length) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!buffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(buffer); - if (!handle.isBuffer()) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - return napi_get_typedarray_info(env, buffer, 0, length, data, 0, 0); - } - /** - * @__sig ipppppp - */ - function napi_get_dataview_info(env, dataview, byte_length, data, arraybuffer, byte_offset) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!dataview) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(dataview); - if (!handle.isDataView()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var v = handle.value; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (byte_length) { - HEAP_DATA_VIEW.setUint32(byte_length, v.byteLength, true); - } - var buffer; - if (data || arraybuffer) { - buffer = v.buffer; - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = emnapiExternalMemory.getViewPointer(v, true).address; - HEAP_DATA_VIEW.setInt32(data, p, true); - } - if (arraybuffer) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var ab = envObject.ensureHandleId(buffer); - HEAP_DATA_VIEW.setInt32(arraybuffer, ab, true); - } - } - if (byte_offset) { - HEAP_DATA_VIEW.setUint32(byte_offset, v.byteOffset, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_date_value(env, value, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (!handle.isDate()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - v = handle.value.valueOf(); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setFloat64(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ippp - */ - function napi_get_value_bool(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'boolean') { - return envObject.setLastError(7 /* napi_status.napi_boolean_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = handle.value ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_value_double(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'number') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = handle.value; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setFloat64(result, r, true); - return envObject.clearLastError(); - } - /** - * @__sig ipppp - */ - function napi_get_value_bigint_int64(env, value, result, lossless) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!lossless) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - var numberValue = handle.value; - if (typeof numberValue !== 'bigint') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if ((numberValue >= (BigInt(-1) * (BigInt(1) << BigInt(63)))) && (numberValue < (BigInt(1) << BigInt(63)))) { - HEAP_DATA_VIEW.setInt8(lossless, 1, true); - } - else { - HEAP_DATA_VIEW.setInt8(lossless, 0, true); - numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); - if (numberValue >= (BigInt(1) << BigInt(63))) { - numberValue = numberValue - (BigInt(1) << BigInt(64)); - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var low = Number(numberValue & BigInt(0xffffffff)); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var high = Number(numberValue >> BigInt(32)); - HEAP_DATA_VIEW.setInt32(result, low, true); - HEAP_DATA_VIEW.setInt32(result + 4, high, true); - return envObject.clearLastError(); - } - /** - * @__sig ipppp - */ - function napi_get_value_bigint_uint64(env, value, result, lossless) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!lossless) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - var numberValue = handle.value; - if (typeof numberValue !== 'bigint') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if ((numberValue >= BigInt(0)) && (numberValue < (BigInt(1) << BigInt(64)))) { - HEAP_DATA_VIEW.setInt8(lossless, 1, true); - } - else { - HEAP_DATA_VIEW.setInt8(lossless, 0, true); - numberValue = numberValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var low = Number(numberValue & BigInt(0xffffffff)); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var high = Number(numberValue >> BigInt(32)); - HEAP_DATA_VIEW.setUint32(result, low, true); - HEAP_DATA_VIEW.setUint32(result + 4, high, true); - return envObject.clearLastError(); - } - /** - * @__sig ippppp - */ - function napi_get_value_bigint_words(env, value, sign_bit, word_count, words) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!word_count) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (!handle.isBigInt()) { - return envObject.setLastError(17 /* napi_status.napi_bigint_expected */); - } - var isMinus = handle.value < BigInt(0); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var word_count_int = HEAP_DATA_VIEW.getUint32(word_count, true); - var wordCount = 0; - var bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value; - while (bigintValue !== BigInt(0)) { - wordCount++; - bigintValue = bigintValue >> BigInt(64); - } - bigintValue = isMinus ? (handle.value * BigInt(-1)) : handle.value; - if (!sign_bit && !words) { - word_count_int = wordCount; - HEAP_DATA_VIEW.setUint32(word_count, word_count_int, true); - } - else { - if (!sign_bit) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!words) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var wordsArr = []; - while (bigintValue !== BigInt(0)) { - var uint64 = bigintValue & ((BigInt(1) << BigInt(64)) - BigInt(1)); - wordsArr.push(uint64); - bigintValue = bigintValue >> BigInt(64); - } - var len = Math.min(word_count_int, wordsArr.length); - for (var i = 0; i < len; i++) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var low = Number(wordsArr[i] & BigInt(0xffffffff)); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var high = Number(wordsArr[i] >> BigInt(32)); - HEAP_DATA_VIEW.setUint32(words + i * 8, low, true); - HEAP_DATA_VIEW.setUint32(words + i * 8 + 4, high, true); - } - HEAP_DATA_VIEW.setInt32(sign_bit, isMinus ? 1 : 0, true); - HEAP_DATA_VIEW.setUint32(word_count, len, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_value_external(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (!handle.isExternal()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = handle.data(envObject); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, p, true); - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_value_int32(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'number') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = new Int32Array([handle.value])[0]; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_value_int64(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'number') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - var numberValue = handle.value; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (numberValue === Number.POSITIVE_INFINITY || numberValue === Number.NEGATIVE_INFINITY || isNaN(numberValue)) { - HEAP_DATA_VIEW.setInt32(result, 0, true); - HEAP_DATA_VIEW.setInt32(result + 4, 0, true); - } - else if (numberValue < /* INT64_RANGE_NEGATIVE */ -9223372036854776000) { - HEAP_DATA_VIEW.setInt32(result, 0, true); - HEAP_DATA_VIEW.setInt32(result + 4, 0x80000000, true); - } - else if (numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000) { - HEAP_DATA_VIEW.setUint32(result, 0xffffffff, true); - HEAP_DATA_VIEW.setUint32(result + 4, 0x7fffffff, true); - } - else { - $emnapiSetValueI64(result, Math.trunc(numberValue)); - } - return envObject.clearLastError(); - } - /** - * @__sig ippppp - */ - function napi_get_value_string_latin1(env, value, buf, buf_size, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - buf_size = buf_size >>> 0; - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!buf) { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); - } - else if (buf_size !== 0) { - var copied = 0; - var v = void 0; - for (var i = 0; i < buf_size - 1; ++i) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = handle.value.charCodeAt(i) & 0xff; - HEAP_DATA_VIEW.setUint8(buf + i, v, true); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - copied++; - } - HEAP_DATA_VIEW.setUint8(buf + copied, 0, true); - if (result) { - HEAP_DATA_VIEW.setUint32(result, copied, true); - } - } - else if (result) { - HEAP_DATA_VIEW.setUint32(result, 0, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippppp - */ - function napi_get_value_string_utf8(env, value, buf, buf_size, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - buf_size = buf_size >>> 0; - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!buf) { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var strLength = emnapiString.lengthBytesUTF8(handle.value); - HEAP_DATA_VIEW.setUint32(result, strLength, true); - } - else if (buf_size !== 0) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var copied = emnapiString.stringToUTF8(handle.value, buf, buf_size); - if (result) { - HEAP_DATA_VIEW.setUint32(result, copied, true); - } - } - else if (result) { - HEAP_DATA_VIEW.setUint32(result, 0, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippppp - */ - function napi_get_value_string_utf16(env, value, buf, buf_size, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - buf_size = buf_size >>> 0; - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!buf) { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - HEAP_DATA_VIEW.setUint32(result, handle.value.length, true); - } - else if (buf_size !== 0) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var copied = emnapiString.stringToUTF16(handle.value, buf, buf_size * 2); - if (result) { - HEAP_DATA_VIEW.setUint32(result, copied / 2, true); - } - } - else if (result) { - HEAP_DATA_VIEW.setUint32(result, 0, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_get_value_uint32(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (typeof handle.value !== 'number') { - return envObject.setLastError(6 /* napi_status.napi_number_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = new Uint32Array([handle.value])[0]; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(result, v, true); - return envObject.clearLastError(); - } - var convert2cMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_get_array_length: napi_get_array_length, - napi_get_arraybuffer_info: napi_get_arraybuffer_info, - napi_get_buffer_info: napi_get_buffer_info, - napi_get_dataview_info: napi_get_dataview_info, - napi_get_date_value: napi_get_date_value, - napi_get_prototype: napi_get_prototype, - napi_get_typedarray_info: napi_get_typedarray_info, - napi_get_value_bigint_int64: napi_get_value_bigint_int64, - napi_get_value_bigint_uint64: napi_get_value_bigint_uint64, - napi_get_value_bigint_words: napi_get_value_bigint_words, - napi_get_value_bool: napi_get_value_bool, - napi_get_value_double: napi_get_value_double, - napi_get_value_external: napi_get_value_external, - napi_get_value_int32: napi_get_value_int32, - napi_get_value_int64: napi_get_value_int64, - napi_get_value_string_latin1: napi_get_value_string_latin1, - napi_get_value_string_utf16: napi_get_value_string_utf16, - napi_get_value_string_utf8: napi_get_value_string_utf8, - napi_get_value_uint32: napi_get_value_uint32 - }); - /** - * @__sig ipip - */ - function napi_create_int32(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = emnapiCtx.addToCurrentScope(value).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.clearLastError(); - } - /** - * @__sig ipip - */ - function napi_create_uint32(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = emnapiCtx.addToCurrentScope(value >>> 0).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.clearLastError(); - } - /** - * @__sig ipjp - */ - function napi_create_int64(env, low, high, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - var value; - if (!high) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - value = Number(low); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v1 = emnapiCtx.addToCurrentScope(value).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(high, v1, true); - return envObject.clearLastError(); - } - /** - * @__sig ipdp - */ - function napi_create_double(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = emnapiCtx.addToCurrentScope(value).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.clearLastError(); - } - /** - * @__sig ipppp - */ - function napi_create_string_latin1(env, str, length, result) { - return emnapiString.newString(env, str, length, result, function (str, autoLength, sizeLength) { - var latin1String = ''; - var len = 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (autoLength) { - while (true) { - var ch = HEAP_DATA_VIEW.getUint8(str, true); - if (!ch) - break; - latin1String += String.fromCharCode(ch); - str++; - } - } - else { - while (len < sizeLength) { - var ch = HEAP_DATA_VIEW.getUint8(str, true); - if (!ch) - break; - latin1String += String.fromCharCode(ch); - len++; - str++; - } - } - return latin1String; - }); - } - /** - * @__sig ipppp - */ - function napi_create_string_utf16(env, str, length, result) { - return emnapiString.newString(env, str, length, result, function (str) { - return emnapiString.UTF16ToString(str, length); - }); - } - /** - * @__sig ipppp - */ - function napi_create_string_utf8(env, str, length, result) { - return emnapiString.newString(env, str, length, result, function (str) { - return emnapiString.UTF8ToString(str, length); + throw err; + } else if (status_1 !== 0 /* napi_status.napi_ok */) { + return envObject.setLastError(status_1); + } + } + value = handle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipp + */ + function napi_create_object(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope({}).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** + * @__sig ippp + */ + function napi_create_symbol(env, description, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!description) { + // eslint-disable-next-line symbol-description, @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(Symbol()).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + } else { + var handle = emnapiCtx.handleStore.get(description); + var desc = handle.value; + if (typeof desc !== 'string') { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = emnapiCtx.addToCurrentScope(Symbol(desc)).id; + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.clearLastError(); + } + /** + * @__sig ipipppp + */ + function napi_create_typedarray( + env, + type, + length, + arraybuffer, + byte_offset, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(arraybuffer); + var buffer = handle.value; + if (!(buffer instanceof ArrayBuffer)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var createTypedArray = function ( + envObject, + Type, + size_of_element, + buffer, + byte_offset, + length, + ) { + var _a; + byte_offset = byte_offset >>> 0; + length = length >>> 0; + if (size_of_element > 1) { + if (byte_offset % size_of_element !== 0) { + var err = new RangeError( + 'start offset of ' + .concat( + (_a = Type.name) !== null && _a !== void 0 ? _a : '', + ' should be a multiple of ', + ) + .concat(size_of_element), + ); + err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT'; + envObject.tryCatch.setError(err); + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + } + if (length * size_of_element + byte_offset > buffer.byteLength) { + var err = new RangeError('Invalid typed array length'); + err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_LENGTH'; + envObject.tryCatch.setError(err); + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + var out = new Type(buffer, byte_offset, length); + if (buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) { + emnapiExternalMemory.wasmMemoryViewTable.set(out, { + Ctor: Type, + address: byte_offset, + length: length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, + }); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(out).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + }; + switch (type) { + case 0 /* napi_typedarray_type.napi_int8_array */: + return createTypedArray( + envObject, + Int8Array, + 1, + buffer, + byte_offset, + length, + ); + case 1 /* napi_typedarray_type.napi_uint8_array */: + return createTypedArray( + envObject, + Uint8Array, + 1, + buffer, + byte_offset, + length, + ); + case 2 /* napi_typedarray_type.napi_uint8_clamped_array */: + return createTypedArray( + envObject, + Uint8ClampedArray, + 1, + buffer, + byte_offset, + length, + ); + case 3 /* napi_typedarray_type.napi_int16_array */: + return createTypedArray( + envObject, + Int16Array, + 2, + buffer, + byte_offset, + length, + ); + case 4 /* napi_typedarray_type.napi_uint16_array */: + return createTypedArray( + envObject, + Uint16Array, + 2, + buffer, + byte_offset, + length, + ); + case 5 /* napi_typedarray_type.napi_int32_array */: + return createTypedArray( + envObject, + Int32Array, + 4, + buffer, + byte_offset, + length, + ); + case 6 /* napi_typedarray_type.napi_uint32_array */: + return createTypedArray( + envObject, + Uint32Array, + 4, + buffer, + byte_offset, + length, + ); + case 7 /* napi_typedarray_type.napi_float32_array */: + return createTypedArray( + envObject, + Float32Array, + 4, + buffer, + byte_offset, + length, + ); + case 8 /* napi_typedarray_type.napi_float64_array */: + return createTypedArray( + envObject, + Float64Array, + 8, + buffer, + byte_offset, + length, + ); + case 9 /* napi_typedarray_type.napi_bigint64_array */: + return createTypedArray( + envObject, + BigInt64Array, + 8, + buffer, + byte_offset, + length, + ); + case 10 /* napi_typedarray_type.napi_biguint64_array */: + return createTypedArray( + envObject, + BigUint64Array, + 8, + buffer, + byte_offset, + length, + ); + default: + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__deps malloc + * @__sig ippp + */ + function napi_create_buffer(env, size, data, result) { + var _a; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value, pointer; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Buffer = emnapiCtx.feature.Buffer; + if (!Buffer) { + throw emnapiCtx.createNotSupportBufferError('napi_create_buffer', ''); + } + var buffer = void 0; + size = size >>> 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!data || size === 0) { + buffer = Buffer.alloc(size); + value = emnapiCtx.addToCurrentScope(buffer).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + } else { + pointer = _malloc(size); + if (!pointer) throw new Error('Out of memory'); + new Uint8Array(wasmMemory.buffer) + .subarray(pointer, pointer + size) + .fill(0); + var buffer_1 = Buffer.from(wasmMemory.buffer, pointer, size); + var viewDescriptor = { + Ctor: Buffer, + address: pointer, + length: size, + ownership: emnapiExternalMemory.registry + ? 0 /* Ownership.kRuntime */ + : 1 /* Ownership.kUserland */, + runtimeAllocated: 1, + }; + emnapiExternalMemory.wasmMemoryViewTable.set( + buffer_1, + viewDescriptor, + ); + (_a = emnapiExternalMemory.registry) === null || _a === void 0 + ? void 0 + : _a.register(viewDescriptor, pointer); + value = emnapiCtx.addToCurrentScope(buffer_1).id; + HEAP_DATA_VIEW.setInt32(result, value, true); + HEAP_DATA_VIEW.setInt32(data, pointer, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ippppp + */ + function napi_create_buffer_copy(env, length, data, result_data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Buffer = emnapiCtx.feature.Buffer; + if (!Buffer) { + throw emnapiCtx.createNotSupportBufferError( + 'napi_create_buffer_copy', + '', + ); + } + var arrayBuffer = emnapiCreateArrayBuffer(length, result_data); + var buffer = Buffer.from(arrayBuffer); + buffer.set( + new Uint8Array(wasmMemory.buffer).subarray(data, data + length), + ); + value = emnapiCtx.addToCurrentScope(buffer).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppppp + */ + function napi_create_external_buffer( + env, + length, + data, + finalize_cb, + finalize_hint, + result, + ) { + return emnapi_create_memory_view( + env, + -2 /* emnapi_memory_view_type.emnapi_buffer */, + data, + length, + finalize_cb, + finalize_hint, + result, + ); + } + /** + * @__sig ippppp + */ + function napi_create_dataview( + env, + byte_length, + arraybuffer, + byte_offset, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + byte_length = byte_length >>> 0; + byte_offset = byte_offset >>> 0; + var handle = emnapiCtx.handleStore.get(arraybuffer); + var buffer = handle.value; + if (!(buffer instanceof ArrayBuffer)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (byte_length + byte_offset > buffer.byteLength) { + var err = new RangeError( + 'byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in', + ); + err.code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS'; + throw err; + } + var dataview = new DataView(buffer, byte_offset, byte_length); + if (buffer === wasmMemory.buffer) { + if (!emnapiExternalMemory.wasmMemoryViewTable.has(dataview)) { + emnapiExternalMemory.wasmMemoryViewTable.set(dataview, { + Ctor: DataView, + address: byte_offset, + length: byte_length, + ownership: 1 /* Ownership.kUserland */, + runtimeAllocated: 0, }); - } - /** - * @__sig ippppppp - */ - function node_api_create_external_string_latin1(env, str, length, finalize_callback, finalize_hint, result, copied) { - return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_latin1, undefined); - } - /** - * @__sig ippppppp - */ - function node_api_create_external_string_utf16(env, str, length, finalize_callback, finalize_hint, result, copied) { - return emnapiString.newExternalString(env, str, length, finalize_callback, finalize_hint, result, copied, napi_create_string_utf16, undefined); - } - /** - * @__sig ipppp - */ - function node_api_create_property_key_utf16(env, str, length, result) { - return napi_create_string_utf16(env, str, length, result); - } - /** - * @__sig ipjp - */ - function napi_create_bigint_int64(env, low, high, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - var value; - if (!high) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - value = low; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v1 = emnapiCtx.addToCurrentScope(value).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(high, v1, true); - return envObject.clearLastError(); - } - /** - * @__sig ipjp - */ - function napi_create_bigint_uint64(env, low, high, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - var value; - if (!high) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - value = low & ((BigInt(1) << BigInt(64)) - BigInt(1)); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v1 = emnapiCtx.addToCurrentScope(value).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(high, v1, true); - return envObject.clearLastError(); - } - /** - * @__sig ipippp - */ - function napi_create_bigint_words(env, sign_bit, word_count, words, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v, i; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!emnapiCtx.feature.supportBigInt) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - word_count = word_count >>> 0; - if (word_count > 2147483647) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (word_count > (1024 * 1024 / (4 * 8) / 2)) { - throw new RangeError('Maximum BigInt size exceeded'); - } - var value = BigInt(0); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (i = 0; i < word_count; i++) { - var low = HEAP_DATA_VIEW.getUint32(words + i * 8, true); - var high = HEAP_DATA_VIEW.getUint32(words + i * 8 + 4, true); - var wordi = BigInt(low) | (BigInt(high) << BigInt(32)); - value += wordi << BigInt(64 * i); - } - value *= ((BigInt(sign_bit) % BigInt(2) === BigInt(0)) ? BigInt(1) : BigInt(-1)); - v = emnapiCtx.addToCurrentScope(value).id; - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - var convert2napiMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_create_bigint_int64: napi_create_bigint_int64, - napi_create_bigint_uint64: napi_create_bigint_uint64, - napi_create_bigint_words: napi_create_bigint_words, - napi_create_double: napi_create_double, - napi_create_int32: napi_create_int32, - napi_create_int64: napi_create_int64, - napi_create_string_latin1: napi_create_string_latin1, - napi_create_string_utf16: napi_create_string_utf16, - napi_create_string_utf8: napi_create_string_utf8, - napi_create_uint32: napi_create_uint32, - node_api_create_external_string_latin1: node_api_create_external_string_latin1, - node_api_create_external_string_utf16: node_api_create_external_string_utf16, - node_api_create_property_key_utf16: node_api_create_property_key_utf16 - }); - function emnapiCreateFunction(envObject, utf8name, length, cb, data) { - var functionName = (!utf8name || !length) ? '' : (emnapiString.UTF8ToString(utf8name, length)); - var f; - var makeFunction = function () { - return function () { - var cbinfo = emnapiCtx.cbinfoStack.push(this, data, arguments, f); - var scope = emnapiCtx.openScope(envObject); - try { - return envObject.callIntoModule(function (envObject) { - var napiValue = (wasmTable.get(cb))(envObject.id, cbinfo); - return (!napiValue) ? undefined : emnapiCtx.handleStore.get(napiValue).value; - }); - } - finally { - emnapiCtx.cbinfoStack.pop(); - emnapiCtx.closeScope(envObject, scope); - } - }; - }; - if (functionName === '') { - f = makeFunction(); - return { status: 0 /* napi_status.napi_ok */, f: f }; - } - if (!(/^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(functionName))) { - return { status: 1 /* napi_status.napi_invalid_arg */, f: undefined }; - } - if (emnapiCtx.feature.supportNewFunction) { - var _ = makeFunction(); - try { - f = (new Function('_', 'return function ' + functionName + '(){' + - '"use strict";' + - 'return _.apply(this,arguments);' + - '};'))(_); - } - catch (_err) { - f = makeFunction(); - if (emnapiCtx.feature.canSetFunctionName) - Object.defineProperty(f, 'name', { value: functionName }); - } - } - else { - f = makeFunction(); - if (emnapiCtx.feature.canSetFunctionName) - Object.defineProperty(f, 'name', { value: functionName }); - } - return { status: 0 /* napi_status.napi_ok */, f: f }; - } - function emnapiDefineProperty(envObject, obj, propertyName, method, getter, setter, value, attributes, data) { - if (getter || setter) { - var localGetter = void 0; - var localSetter = void 0; - if (getter) { - localGetter = emnapiCreateFunction(envObject, 0, 0, getter, data).f; - } - if (setter) { - localSetter = emnapiCreateFunction(envObject, 0, 0, setter, data).f; - } - var desc = { - configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, - enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, - get: localGetter, - set: localSetter - }; - Object.defineProperty(obj, propertyName, desc); - } - else if (method) { - var localMethod = emnapiCreateFunction(envObject, 0, 0, method, data).f; - var desc = { - configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, - enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, - writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0, - value: localMethod - }; - Object.defineProperty(obj, propertyName, desc); - } - else { - var desc = { - configurable: (attributes & 4 /* napi_property_attributes.napi_configurable */) !== 0, - enumerable: (attributes & 2 /* napi_property_attributes.napi_enumerable */) !== 0, - writable: (attributes & 1 /* napi_property_attributes.napi_writable */) !== 0, - value: emnapiCtx.handleStore.get(value).value - }; - Object.defineProperty(obj, propertyName, desc); - } - } - function emnapiGetHandle(js_object) { - var handle = emnapiCtx.handleStore.get(js_object); - if (!(handle.isObject() || handle.isFunction())) { - return { status: 1 /* napi_status.napi_invalid_arg */ }; - } - if (typeof emnapiExternalMemory !== 'undefined' && ArrayBuffer.isView(handle.value)) { - if (emnapiExternalMemory.wasmMemoryViewTable.has(handle.value)) { - handle = emnapiCtx.addToCurrentScope(emnapiExternalMemory.wasmMemoryViewTable.get(handle.value)); - } - } - return { status: 0 /* napi_status.napi_ok */, handle: handle }; - } - function emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var referenceId; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!emnapiCtx.feature.supportFinalizer) { - if (finalize_cb) { - throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "finalize_cb" must be 0(NULL)'); - } - if (result) { - throw emnapiCtx.createNotSupportWeakRefError('napi_wrap', 'Parameter "result" must be 0(NULL)'); - } - } - if (!js_object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handleResult = emnapiGetHandle(js_object); - if (handleResult.status !== 0 /* napi_status.napi_ok */) { - return envObject.setLastError(handleResult.status); - } - var handle = handleResult.handle; - if (envObject.getObjectBinding(handle.value).wrapped !== 0) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var reference = void 0; - if (result) { - if (!finalize_cb) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - reference = emnapiCtx.createReference(envObject, handle.id, 0, 1 /* Ownership.kUserland */, finalize_cb, native_object, finalize_hint); - referenceId = reference.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, referenceId, true); - } - else { - reference = emnapiCtx.createReference(envObject, handle.id, 0, 0 /* Ownership.kRuntime */, finalize_cb, native_object, !finalize_cb ? finalize_cb : finalize_hint); - } - envObject.getObjectBinding(handle.value).wrapped = reference.id; - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - function emnapiUnwrap(env, js_object, result, action) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var data; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!js_object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (action === 0 /* UnwrapAction.KeepWrap */) { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var value = emnapiCtx.handleStore.get(js_object); - if (!(value.isObject() || value.isFunction())) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var binding = envObject.getObjectBinding(value.value); - var referenceId = binding.wrapped; - var ref = emnapiCtx.refStore.get(referenceId); - if (!ref) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - data = ref.data(); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, data, true); - } - if (action === 1 /* UnwrapAction.RemoveWrap */) { - binding.wrapped = 0; - if (ref.ownership() === 1 /* Ownership.kUserland */) { - // When the wrap is been removed, the finalizer should be reset. - ref.resetFinalizer(); - } - else { - ref.dispose(); - } - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppppppp - */ - function napi_define_class(env, utf8name, length, constructor, callback_data, property_count, properties, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var propPtr, valueHandleId, attributes; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!constructor) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - property_count = property_count >>> 0; - if (property_count > 0) { - if (!properties) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if ((length < -1) || (length > 2147483647) || (!utf8name)) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var fresult = emnapiCreateFunction(envObject, utf8name, length, constructor, callback_data); - if (fresult.status !== 0 /* napi_status.napi_ok */) - return envObject.setLastError(fresult.status); - var F = fresult.f; - var propertyName = void 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (var i = 0; i < property_count; i++) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - propPtr = properties + (i * (4 * 8)); - var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); - var name_1 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); - var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); - var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); - var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); - var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); - attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); - var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); - if (utf8Name) { - propertyName = emnapiString.UTF8ToString(utf8Name, -1); - } - else { - if (!name_1) { - return envObject.setLastError(4 /* napi_status.napi_name_expected */); - } - propertyName = emnapiCtx.handleStore.get(name_1).value; - if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') { - return envObject.setLastError(4 /* napi_status.napi_name_expected */); - } - } - if ((attributes & 1024 /* napi_property_attributes.napi_static */) !== 0) { - emnapiDefineProperty(envObject, F, propertyName, method, getter, setter, value, attributes, data); - continue; - } - emnapiDefineProperty(envObject, F.prototype, propertyName, method, getter, setter, value, attributes, data); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var valueHandle = emnapiCtx.addToCurrentScope(F); - valueHandleId = valueHandle.id; - HEAP_DATA_VIEW.setInt32(result, valueHandleId, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppppp - */ - function napi_wrap(env, js_object, native_object, finalize_cb, finalize_hint, result) { - return emnapiWrap(env, js_object, native_object, finalize_cb, finalize_hint, result); - } - /** - * @__sig ippp - */ - function napi_unwrap(env, js_object, result) { - return emnapiUnwrap(env, js_object, result, 0 /* UnwrapAction.KeepWrap */); - } - /** - * @__sig ippp - */ - function napi_remove_wrap(env, js_object, result) { - return emnapiUnwrap(env, js_object, result, 1 /* UnwrapAction.RemoveWrap */); - } - /** - * @__sig ippp - */ - function napi_type_tag_object(env, object, type_tag) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - var value = emnapiCtx.handleStore.get(object); - if (!(value.isObject() || value.isFunction())) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */); - } - if (!type_tag) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - var binding = envObject.getObjectBinding(value.value); - if (binding.tag !== null) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - var tag = new Uint8Array(16); - tag.set(new Uint8Array(wasmMemory.buffer, type_tag, 16)); - binding.tag = new Uint32Array(tag.buffer); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppp - */ - function napi_check_object_type_tag(env, object, type_tag, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars, one-var - var ret = true; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - var value = emnapiCtx.handleStore.get(object); - if (!(value.isObject() || value.isFunction())) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 2 /* napi_status.napi_object_expected */); - } - if (!type_tag) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - if (!result) { - return envObject.setLastError(envObject.tryCatch.hasCaught() ? 10 /* napi_status.napi_pending_exception */ : 1 /* napi_status.napi_invalid_arg */); - } - var binding = envObject.getObjectBinding(value.value); - if (binding.tag !== null) { - var tag = binding.tag; - var typeTag = new Uint32Array(wasmMemory.buffer, type_tag, 4); - ret = (tag[0] === typeTag[0] && - tag[1] === typeTag[1] && - tag[2] === typeTag[2] && - tag[3] === typeTag[3]); - } - else { - ret = false; - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, ret ? 1 : 0, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppppp - */ - function napi_add_finalizer(env, js_object, finalize_data, finalize_cb, finalize_hint, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!emnapiCtx.feature.supportFinalizer) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - if (!js_object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!finalize_cb) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handleResult = emnapiGetHandle(js_object); - if (handleResult.status !== 0 /* napi_status.napi_ok */) { - return envObject.setLastError(handleResult.status); - } - var handle = handleResult.handle; - var ownership = !result ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */; - var reference = emnapiCtx.createReference(envObject, handle.id, 0, ownership, finalize_cb, finalize_data, finalize_hint); - if (result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var referenceId = reference.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, referenceId, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ipppp - */ - function node_api_post_finalizer(env, finalize_cb, finalize_data, finalize_hint) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - envObject.enqueueFinalizer(emnapiCtx.createTrackedFinalizer(envObject, finalize_cb, finalize_data, finalize_hint)); - return envObject.clearLastError(); - } - var wrapMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_add_finalizer: napi_add_finalizer, - napi_check_object_type_tag: napi_check_object_type_tag, - napi_define_class: napi_define_class, - napi_remove_wrap: napi_remove_wrap, - napi_type_tag_object: napi_type_tag_object, - napi_unwrap: napi_unwrap, - napi_wrap: napi_wrap, - node_api_post_finalizer: node_api_post_finalizer - }); - /** - * @__sig ipippppp - */ - function emnapi_create_memory_view(env, typedarray_type, external_data, byte_length, finalize_cb, finalize_hint, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - byte_length = byte_length >>> 0; - if (!external_data) { - byte_length = 0; - } - if (byte_length > 2147483647) { - throw new RangeError('Cannot create a memory view larger than 2147483647 bytes'); - } - if ((external_data + byte_length) > wasmMemory.buffer.byteLength) { - throw new RangeError('Memory out of range'); - } - if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { - throw emnapiCtx.createNotSupportWeakRefError('emnapi_create_memory_view', 'Parameter "finalize_cb" must be 0(NULL)'); - } - var viewDescriptor = void 0; - switch (typedarray_type) { - case 0 /* emnapi_memory_view_type.emnapi_int8_array */: - viewDescriptor = { Ctor: Int8Array, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 1 /* emnapi_memory_view_type.emnapi_uint8_array */: - viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 2 /* emnapi_memory_view_type.emnapi_uint8_clamped_array */: - viewDescriptor = { Ctor: Uint8ClampedArray, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 3 /* emnapi_memory_view_type.emnapi_int16_array */: - viewDescriptor = { Ctor: Int16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 4 /* emnapi_memory_view_type.emnapi_uint16_array */: - viewDescriptor = { Ctor: Uint16Array, address: external_data, length: byte_length >> 1, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 5 /* emnapi_memory_view_type.emnapi_int32_array */: - viewDescriptor = { Ctor: Int32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 6 /* emnapi_memory_view_type.emnapi_uint32_array */: - viewDescriptor = { Ctor: Uint32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 7 /* emnapi_memory_view_type.emnapi_float32_array */: - viewDescriptor = { Ctor: Float32Array, address: external_data, length: byte_length >> 2, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 8 /* emnapi_memory_view_type.emnapi_float64_array */: - viewDescriptor = { Ctor: Float64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 9 /* emnapi_memory_view_type.emnapi_bigint64_array */: - viewDescriptor = { Ctor: BigInt64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case 10 /* emnapi_memory_view_type.emnapi_biguint64_array */: - viewDescriptor = { Ctor: BigUint64Array, address: external_data, length: byte_length >> 3, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case -1 /* emnapi_memory_view_type.emnapi_data_view */: - viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - case -2 /* emnapi_memory_view_type.emnapi_buffer */: { - if (!emnapiCtx.feature.Buffer) { - throw emnapiCtx.createNotSupportBufferError('emnapi_create_memory_view', ''); - } - viewDescriptor = { Ctor: emnapiCtx.feature.Buffer, address: external_data, length: byte_length, ownership: 1 /* Ownership.kUserland */, runtimeAllocated: 0 }; - break; - } - default: return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var Ctor = viewDescriptor.Ctor; - var typedArray = typedarray_type === -2 /* emnapi_memory_view_type.emnapi_buffer */ - ? emnapiCtx.feature.Buffer.from(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length) - : new Ctor(wasmMemory.buffer, viewDescriptor.address, viewDescriptor.length); - var handle = emnapiCtx.addToCurrentScope(typedArray); - emnapiExternalMemory.wasmMemoryViewTable.set(typedArray, viewDescriptor); - if (finalize_cb) { - var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0); - if (status_1 === 10 /* napi_status.napi_pending_exception */) { - var err = envObject.tryCatch.extractException(); - envObject.clearLastError(); - throw err; - } - else if (status_1 !== 0 /* napi_status.napi_ok */) { - return envObject.setLastError(status_1); - } - } - value = handle.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig i - */ - function emnapi_is_support_weakref() { - return emnapiCtx.feature.supportFinalizer ? 1 : 0; - } - /** - * @__sig i - */ - function emnapi_is_support_bigint() { - return emnapiCtx.feature.supportBigInt ? 1 : 0; - } - /** - * @__sig i - */ - function emnapi_is_node_binding_available() { - return emnapiNodeBinding ? 1 : 0; - } - function $emnapiSyncMemory(js_to_wasm, arrayBufferOrView, offset, len) { - offset = offset !== null && offset !== void 0 ? offset : 0; - offset = offset >>> 0; - var view; - if (arrayBufferOrView instanceof ArrayBuffer) { - var pointer = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false).address; - if (!pointer) - throw new Error('Unknown ArrayBuffer address'); - if (typeof len !== 'number' || len === -1) { - len = arrayBufferOrView.byteLength - offset; - } - len = len >>> 0; - if (len === 0) - return arrayBufferOrView; - view = new Uint8Array(arrayBufferOrView, offset, len); - var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); - if (!js_to_wasm) { - view.set(wasmMemoryU8.subarray(pointer, pointer + len)); - } - else { - wasmMemoryU8.set(view, pointer); - } - return arrayBufferOrView; - } - if (ArrayBuffer.isView(arrayBufferOrView)) { - var viewPointerInfo = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false); - var latestView = viewPointerInfo.view; - var pointer = viewPointerInfo.address; - if (!pointer) - throw new Error('Unknown ArrayBuffer address'); - if (typeof len !== 'number' || len === -1) { - len = latestView.byteLength - offset; - } - len = len >>> 0; - if (len === 0) - return latestView; - view = new Uint8Array(latestView.buffer, latestView.byteOffset + offset, len); - var wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); - if (!js_to_wasm) { - view.set(wasmMemoryU8.subarray(pointer, pointer + len)); - } - else { - wasmMemoryU8.set(view, pointer); - } - return latestView; - } - throw new TypeError('emnapiSyncMemory expect ArrayBuffer or ArrayBufferView as first parameter'); - } - /** - * @__sig ipippp - */ - function emnapi_sync_memory(env, js_to_wasm, arraybuffer_or_view, offset, len) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!arraybuffer_or_view) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var handleId = HEAP_DATA_VIEW.getInt32(arraybuffer_or_view, true); - var handle = envObject.ctx.handleStore.get(handleId); - if (!handle.isArrayBuffer() && !handle.isTypedArray() && !handle.isDataView()) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var ret = $emnapiSyncMemory(Boolean(js_to_wasm), handle.value, offset, len); - if (handle.value !== ret) { - v = envObject.ensureHandleId(ret); - HEAP_DATA_VIEW.setInt32(arraybuffer_or_view, v, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - function $emnapiGetMemoryAddress(arrayBufferOrView) { - var isArrayBuffer = arrayBufferOrView instanceof ArrayBuffer; - var isDataView = arrayBufferOrView instanceof DataView; - var isTypedArray = ArrayBuffer.isView(arrayBufferOrView) && !isDataView; - if (!isArrayBuffer && !isTypedArray && !isDataView) { - throw new TypeError('emnapiGetMemoryAddress expect ArrayBuffer or ArrayBufferView as first parameter'); - } - var info; - if (isArrayBuffer) { - info = emnapiExternalMemory.getArrayBufferPointer(arrayBufferOrView, false); - } - else { - info = emnapiExternalMemory.getViewPointer(arrayBufferOrView, false); - } - return { - address: info.address, - ownership: info.ownership, - runtimeAllocated: info.runtimeAllocated - }; - } - /** - * @__sig ipppp - */ - function emnapi_get_memory_address(env, arraybuffer_or_view, address, ownership, runtime_allocated) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p, runtimeAllocated, ownershipOut; - var info; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!arraybuffer_or_view) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!address && !ownership && !runtime_allocated) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var handle = envObject.ctx.handleStore.get(arraybuffer_or_view); - info = $emnapiGetMemoryAddress(handle.value); - p = info.address; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (address) { - HEAP_DATA_VIEW.setInt32(address, p, true); - } - if (ownership) { - ownershipOut = info.ownership; - HEAP_DATA_VIEW.setInt32(ownership, ownershipOut, true); - } - if (runtime_allocated) { - runtimeAllocated = info.runtimeAllocated; - HEAP_DATA_VIEW.setInt8(runtime_allocated, runtimeAllocated, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipp - */ - function emnapi_get_runtime_version(env, version) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!version) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var runtimeVersion; - try { - runtimeVersion = emnapiCtx.getRuntimeVersions().version; - } - catch (_) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var versions = runtimeVersion.split('.') - .map(function (n) { return Number(n); }); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(version, versions[0], true); - HEAP_DATA_VIEW.setUint32(version + 4, versions[1], true); - HEAP_DATA_VIEW.setUint32(version + 8, versions[2], true); - return envObject.clearLastError(); - } - var emnapiMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - $emnapiGetMemoryAddress: $emnapiGetMemoryAddress, - $emnapiSyncMemory: $emnapiSyncMemory, - emnapi_create_memory_view: emnapi_create_memory_view, - emnapi_get_memory_address: emnapi_get_memory_address, - emnapi_get_runtime_version: emnapi_get_runtime_version, - emnapi_is_node_binding_available: emnapi_is_node_binding_available, - emnapi_is_support_bigint: emnapi_is_support_bigint, - emnapi_is_support_weakref: emnapi_is_support_weakref, - emnapi_sync_memory: emnapi_sync_memory - }); - /** - * @__sig ipp - */ - function napi_create_array(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope([]).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_create_array_with_length(env, length, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - length = length >>> 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(new Array(length)).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - function emnapiCreateArrayBuffer(byte_length, data) { - byte_length = byte_length >>> 0; - var arrayBuffer = new ArrayBuffer(byte_length); - if (data) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var p = emnapiExternalMemory.getArrayBufferPointer(arrayBuffer, true).address; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(data, p, true); - } - return arrayBuffer; - } - /** - * @__sig ipppp - */ - function napi_create_arraybuffer(env, byte_length, data, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var arrayBuffer = emnapiCreateArrayBuffer(byte_length, data); - value = emnapiCtx.addToCurrentScope(arrayBuffer).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipdp - */ - function napi_create_date(env, time, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = emnapiCtx.addToCurrentScope(new Date(time)).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ippppp - */ - function napi_create_external(env, data, finalize_cb, finalize_hint, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { - throw emnapiCtx.createNotSupportWeakRefError('napi_create_external', 'Parameter "finalize_cb" must be 0(NULL)'); - } - var externalHandle = emnapiCtx.getCurrentScope().addExternal(envObject, data); - if (finalize_cb) { - emnapiCtx.createReference(envObject, externalHandle.id, 0, 0 /* Ownership.kRuntime */, finalize_cb, data, finalize_hint); - } - value = externalHandle.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppppp - */ - function napi_create_external_arraybuffer(env, external_data, byte_length, finalize_cb, finalize_hint, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - byte_length = byte_length >>> 0; - if (!external_data) { - byte_length = 0; - } - if ((external_data + byte_length) > wasmMemory.buffer.byteLength) { - throw new RangeError('Memory out of range'); - } - if (!emnapiCtx.feature.supportFinalizer && finalize_cb) { - throw emnapiCtx.createNotSupportWeakRefError('napi_create_external_arraybuffer', 'Parameter "finalize_cb" must be 0(NULL)'); - } - var arrayBuffer = new ArrayBuffer(byte_length); - if (byte_length === 0) { - try { - var MessageChannel_1 = emnapiCtx.feature.MessageChannel; - var messageChannel = new MessageChannel_1(); - messageChannel.port1.postMessage(arrayBuffer, [arrayBuffer]); - } - catch (_) { } - } - else { - var u8arr = new Uint8Array(arrayBuffer); - u8arr.set(new Uint8Array(wasmMemory.buffer).subarray(external_data, external_data + byte_length)); - emnapiExternalMemory.table.set(arrayBuffer, { - address: external_data, - ownership: 1 /* Ownership.kUserland */, - runtimeAllocated: 0 - }); - } - var handle = emnapiCtx.addToCurrentScope(arrayBuffer); - if (finalize_cb) { - var status_1 = napi_add_finalizer(env, handle.id, external_data, finalize_cb, finalize_hint, /* NULL */ 0); - if (status_1 === 10 /* napi_status.napi_pending_exception */) { - var err = envObject.tryCatch.extractException(); - envObject.clearLastError(); - throw err; - } - else if (status_1 !== 0 /* napi_status.napi_ok */) { - return envObject.setLastError(status_1); - } - } - value = handle.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipp - */ - function napi_create_object(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope({}).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** - * @__sig ippp - */ - function napi_create_symbol(env, description, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!description) { - // eslint-disable-next-line symbol-description, @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(Symbol()).id; - HEAP_DATA_VIEW.setInt32(result, value, true); - } - else { - var handle = emnapiCtx.handleStore.get(description); - var desc = handle.value; - if (typeof desc !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = emnapiCtx.addToCurrentScope(Symbol(desc)).id; - HEAP_DATA_VIEW.setInt32(result, v, true); - } - return envObject.clearLastError(); - } - /** - * @__sig ipipppp - */ - function napi_create_typedarray(env, type, length, arraybuffer, byte_offset, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!arraybuffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(arraybuffer); - var buffer = handle.value; - if (!(buffer instanceof ArrayBuffer)) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var createTypedArray = function (envObject, Type, size_of_element, buffer, byte_offset, length) { - var _a; - byte_offset = byte_offset >>> 0; - length = length >>> 0; - if (size_of_element > 1) { - if ((byte_offset) % (size_of_element) !== 0) { - var err = new RangeError("start offset of ".concat((_a = Type.name) !== null && _a !== void 0 ? _a : '', " should be a multiple of ").concat(size_of_element)); - err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT'; - envObject.tryCatch.setError(err); - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - } - if (((length * size_of_element) + byte_offset) > buffer.byteLength) { - var err = new RangeError('Invalid typed array length'); - err.code = 'ERR_NAPI_INVALID_TYPEDARRAY_LENGTH'; - envObject.tryCatch.setError(err); - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - var out = new Type(buffer, byte_offset, length); - if (buffer === wasmMemory.buffer) { - if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) { - emnapiExternalMemory.wasmMemoryViewTable.set(out, { - Ctor: Type, - address: byte_offset, - length: length, - ownership: 1 /* Ownership.kUserland */, - runtimeAllocated: 0 - }); - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = emnapiCtx.addToCurrentScope(out).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - }; - switch (type) { - case 0 /* napi_typedarray_type.napi_int8_array */: - return createTypedArray(envObject, Int8Array, 1, buffer, byte_offset, length); - case 1 /* napi_typedarray_type.napi_uint8_array */: - return createTypedArray(envObject, Uint8Array, 1, buffer, byte_offset, length); - case 2 /* napi_typedarray_type.napi_uint8_clamped_array */: - return createTypedArray(envObject, Uint8ClampedArray, 1, buffer, byte_offset, length); - case 3 /* napi_typedarray_type.napi_int16_array */: - return createTypedArray(envObject, Int16Array, 2, buffer, byte_offset, length); - case 4 /* napi_typedarray_type.napi_uint16_array */: - return createTypedArray(envObject, Uint16Array, 2, buffer, byte_offset, length); - case 5 /* napi_typedarray_type.napi_int32_array */: - return createTypedArray(envObject, Int32Array, 4, buffer, byte_offset, length); - case 6 /* napi_typedarray_type.napi_uint32_array */: - return createTypedArray(envObject, Uint32Array, 4, buffer, byte_offset, length); - case 7 /* napi_typedarray_type.napi_float32_array */: - return createTypedArray(envObject, Float32Array, 4, buffer, byte_offset, length); - case 8 /* napi_typedarray_type.napi_float64_array */: - return createTypedArray(envObject, Float64Array, 8, buffer, byte_offset, length); - case 9 /* napi_typedarray_type.napi_bigint64_array */: - return createTypedArray(envObject, BigInt64Array, 8, buffer, byte_offset, length); - case 10 /* napi_typedarray_type.napi_biguint64_array */: - return createTypedArray(envObject, BigUint64Array, 8, buffer, byte_offset, length); - default: - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__deps malloc - * @__sig ippp - */ - function napi_create_buffer(env, size, data, result) { - var _a; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value, pointer; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var Buffer = emnapiCtx.feature.Buffer; - if (!Buffer) { - throw emnapiCtx.createNotSupportBufferError('napi_create_buffer', ''); - } - var buffer = void 0; - size = size >>> 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!data || (size === 0)) { - buffer = Buffer.alloc(size); - value = emnapiCtx.addToCurrentScope(buffer).id; - HEAP_DATA_VIEW.setInt32(result, value, true); - } - else { - pointer = _malloc(size); - if (!pointer) - throw new Error('Out of memory'); - new Uint8Array(wasmMemory.buffer).subarray(pointer, pointer + size).fill(0); - var buffer_1 = Buffer.from(wasmMemory.buffer, pointer, size); - var viewDescriptor = { - Ctor: Buffer, - address: pointer, - length: size, - ownership: emnapiExternalMemory.registry ? 0 /* Ownership.kRuntime */ : 1 /* Ownership.kUserland */, - runtimeAllocated: 1 - }; - emnapiExternalMemory.wasmMemoryViewTable.set(buffer_1, viewDescriptor); - (_a = emnapiExternalMemory.registry) === null || _a === void 0 ? void 0 : _a.register(viewDescriptor, pointer); - value = emnapiCtx.addToCurrentScope(buffer_1).id; - HEAP_DATA_VIEW.setInt32(result, value, true); - HEAP_DATA_VIEW.setInt32(data, pointer, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ippppp - */ - function napi_create_buffer_copy(env, length, data, result_data, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var Buffer = emnapiCtx.feature.Buffer; - if (!Buffer) { - throw emnapiCtx.createNotSupportBufferError('napi_create_buffer_copy', ''); - } - var arrayBuffer = emnapiCreateArrayBuffer(length, result_data); - var buffer = Buffer.from(arrayBuffer); - buffer.set(new Uint8Array(wasmMemory.buffer).subarray(data, data + length)); - value = emnapiCtx.addToCurrentScope(buffer).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppppp - */ - function napi_create_external_buffer(env, length, data, finalize_cb, finalize_hint, result) { - return emnapi_create_memory_view(env, -2 /* emnapi_memory_view_type.emnapi_buffer */, data, length, finalize_cb, finalize_hint, result); - } - /** - * @__sig ippppp - */ - function napi_create_dataview(env, byte_length, arraybuffer, byte_offset, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!arraybuffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - byte_length = byte_length >>> 0; - byte_offset = byte_offset >>> 0; - var handle = emnapiCtx.handleStore.get(arraybuffer); - var buffer = handle.value; - if (!(buffer instanceof ArrayBuffer)) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if ((byte_length + byte_offset) > buffer.byteLength) { - var err = new RangeError('byte_offset + byte_length should be less than or equal to the size in bytes of the array passed in'); - err.code = 'ERR_NAPI_INVALID_DATAVIEW_ARGS'; - throw err; - } - var dataview = new DataView(buffer, byte_offset, byte_length); - if (buffer === wasmMemory.buffer) { - if (!emnapiExternalMemory.wasmMemoryViewTable.has(dataview)) { - emnapiExternalMemory.wasmMemoryViewTable.set(dataview, { - Ctor: DataView, - address: byte_offset, - length: byte_length, - ownership: 1 /* Ownership.kUserland */, - runtimeAllocated: 0 - }); - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = emnapiCtx.addToCurrentScope(dataview).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** - * @__sig ipppp - */ - function node_api_symbol_for(env, utf8description, length, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var autoLength = length === -1; - var sizelength = length >>> 0; - if (length !== 0) { - if (!utf8description) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!(autoLength || (sizelength <= 2147483647))) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var descriptionString = emnapiString.UTF8ToString(utf8description, length); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(Symbol.for(descriptionString)).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - var createMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_create_array: napi_create_array, - napi_create_array_with_length: napi_create_array_with_length, - napi_create_arraybuffer: napi_create_arraybuffer, - napi_create_buffer: napi_create_buffer, - napi_create_buffer_copy: napi_create_buffer_copy, - napi_create_dataview: napi_create_dataview, - napi_create_date: napi_create_date, - napi_create_external: napi_create_external, - napi_create_external_arraybuffer: napi_create_external_arraybuffer, - napi_create_external_buffer: napi_create_external_buffer, - napi_create_object: napi_create_object, - napi_create_symbol: napi_create_symbol, - napi_create_typedarray: napi_create_typedarray, - node_api_symbol_for: node_api_symbol_for - }); - /** @__sig ipip */ - function napi_get_boolean(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = value === 0 ? 3 /* GlobalHandle.FALSE */ : 4 /* GlobalHandle.TRUE */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_get_global(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = 5 /* GlobalHandle.GLOBAL */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_get_null(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = 2 /* GlobalHandle.NULL */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_get_undefined(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = 1 /* GlobalHandle.UNDEFINED */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - var globalMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_get_boolean: napi_get_boolean, - napi_get_global: napi_get_global, - napi_get_null: napi_get_null, - napi_get_undefined: napi_get_undefined - }); - /** @__sig ipppp */ - function napi_set_instance_data(env, data, finalize_cb, finalize_hint) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - envObject.setInstanceData(data, finalize_cb, finalize_hint); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_get_instance_data(env, data) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!data) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = envObject.getInstanceData(); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(data, value, true); - return envObject.clearLastError(); - } - var envMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_get_instance_data: napi_get_instance_data, - napi_set_instance_data: napi_set_instance_data - }); - /** @__sig vpppp */ - function _emnapi_get_last_error_info(env, error_code, engine_error_code, engine_reserved) { - var envObject = emnapiCtx.envStore.get(env); - var lastError = envObject.lastError; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var errorCode = lastError.errorCode; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var engineErrorCode = lastError.engineErrorCode >>> 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var engineReserved = lastError.engineReserved; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(error_code, errorCode, true); - HEAP_DATA_VIEW.setUint32(engine_error_code, engineErrorCode, true); - HEAP_DATA_VIEW.setInt32(engine_reserved, engineReserved, true); - } - /** @__sig ipp */ - function napi_throw(env, error) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!error) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - envObject.tryCatch.setError(emnapiCtx.handleStore.get(error).value); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_throw_error(env, code, msg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var error = new Error(emnapiString.UTF8ToString(msg, -1)); - if (code) - error.code = emnapiString.UTF8ToString(code, -1); - envObject.tryCatch.setError(error); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_throw_type_error(env, code, msg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var error = new TypeError(emnapiString.UTF8ToString(msg, -1)); - if (code) - error.code = emnapiString.UTF8ToString(code, -1); - envObject.tryCatch.setError(error); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_throw_range_error(env, code, msg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var error = new RangeError(emnapiString.UTF8ToString(msg, -1)); - if (code) - error.code = emnapiString.UTF8ToString(code, -1); - envObject.tryCatch.setError(error); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function node_api_throw_syntax_error(env, code, msg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var error = new SyntaxError(emnapiString.UTF8ToString(msg, -1)); - if (code) - error.code = emnapiString.UTF8ToString(code, -1); - envObject.tryCatch.setError(error); - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipp */ - function napi_is_exception_pending(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = envObject.tryCatch.hasCaught(); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function napi_create_error(env, code, msg, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var msgValue = emnapiCtx.handleStore.get(msg).value; - if (typeof msgValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var error = new Error(msgValue); - if (code) { - var codeValue = emnapiCtx.handleStore.get(code).value; - if (typeof codeValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - error.code = codeValue; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(error).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function napi_create_type_error(env, code, msg, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var msgValue = emnapiCtx.handleStore.get(msg).value; - if (typeof msgValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var error = new TypeError(msgValue); - if (code) { - var codeValue = emnapiCtx.handleStore.get(code).value; - if (typeof codeValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - error.code = codeValue; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(error).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function napi_create_range_error(env, code, msg, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var msgValue = emnapiCtx.handleStore.get(msg).value; - if (typeof msgValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var error = new RangeError(msgValue); - if (code) { - var codeValue = emnapiCtx.handleStore.get(code).value; - if (typeof codeValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - error.code = codeValue; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(error).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function node_api_create_syntax_error(env, code, msg, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!msg) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var msgValue = emnapiCtx.handleStore.get(msg).value; - if (typeof msgValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var error = new SyntaxError(msgValue); - if (code) { - var codeValue = emnapiCtx.handleStore.get(code).value; - if (typeof codeValue !== 'string') { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - error.code = codeValue; - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = emnapiCtx.addToCurrentScope(error).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_get_and_clear_last_exception(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (!envObject.tryCatch.hasCaught()) { - HEAP_DATA_VIEW.setInt32(result, 1, true); // ID_UNDEFINED - return envObject.clearLastError(); - } - else { - var err = envObject.tryCatch.exception(); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = envObject.ensureHandleId(err); - HEAP_DATA_VIEW.setInt32(result, value, true); - envObject.tryCatch.reset(); - } - return envObject.clearLastError(); - } - /** @__sig vpppp */ - function napi_fatal_error(location, location_len, message, message_len) { - var locationStr = emnapiString.UTF8ToString(location, location_len); - var messageStr = emnapiString.UTF8ToString(message, message_len); - if (emnapiNodeBinding) { - emnapiNodeBinding.napi.fatalError(locationStr, messageStr); - } - else { - abort('FATAL ERROR: ' + locationStr + ' ' + messageStr); - } - } - /** @__sig ipp */ - function napi_fatal_exception(env, err) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!err) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var error = envObject.ctx.handleStore.get(err); - try { - envObject.triggerFatalException(error.value); - } - catch (_) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - var errorMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - _emnapi_get_last_error_info: _emnapi_get_last_error_info, - napi_create_error: napi_create_error, - napi_create_range_error: napi_create_range_error, - napi_create_type_error: napi_create_type_error, - napi_fatal_error: napi_fatal_error, - napi_fatal_exception: napi_fatal_exception, - napi_get_and_clear_last_exception: napi_get_and_clear_last_exception, - napi_is_exception_pending: napi_is_exception_pending, - napi_throw: napi_throw, - napi_throw_error: napi_throw_error, - napi_throw_range_error: napi_throw_range_error, - napi_throw_type_error: napi_throw_type_error, - node_api_create_syntax_error: node_api_create_syntax_error, - node_api_throw_syntax_error: node_api_throw_syntax_error - }); - /** @__sig ipppppp */ - function napi_create_function(env, utf8name, length, cb, data, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!cb) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var fresult = emnapiCreateFunction(envObject, utf8name, length, cb, data); - if (fresult.status !== 0 /* napi_status.napi_ok */) - return envObject.setLastError(fresult.status); - var f = fresult.f; - var valueHandle = emnapiCtx.addToCurrentScope(f); - value = valueHandle.id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppppp */ - function napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!cbinfo) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (argv) { - if (!argc) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var argcValue = HEAP_DATA_VIEW.getUint32(argc, true); - var len = cbinfoValue.args.length; - var arrlen = argcValue < len ? argcValue : len; - var i = 0; - for (; i < arrlen; i++) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var argVal = envObject.ensureHandleId(cbinfoValue.args[i]); - HEAP_DATA_VIEW.setInt32(argv + i * 4, argVal, true); - } - if (i < argcValue) { - for (; i < argcValue; i++) { - HEAP_DATA_VIEW.setInt32(argv + i * 4, 1, true); - } - } - } - if (argc) { - HEAP_DATA_VIEW.setUint32(argc, cbinfoValue.args.length, true); - } - if (this_arg) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v = envObject.ensureHandleId(cbinfoValue.thiz); - HEAP_DATA_VIEW.setInt32(this_arg, v, true); - } - if (data) { - HEAP_DATA_VIEW.setInt32(data, cbinfoValue.data, true); - } - return envObject.clearLastError(); - } - /** @__sig ipppppp */ - function napi_call_function(env, recv, func, argc, argv, result) { - var i = 0; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!recv) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - argc = argc >>> 0; - if (argc > 0) { - if (!argv) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var v8recv = emnapiCtx.handleStore.get(recv).value; - if (!func) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var v8func = emnapiCtx.handleStore.get(func).value; - if (typeof v8func !== 'function') - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var args = []; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (; i < argc; i++) { - var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); - args.push(emnapiCtx.handleStore.get(argVal).value); - } - var ret = v8func.apply(v8recv, args); - if (result) { - v = envObject.ensureHandleId(ret); - HEAP_DATA_VIEW.setInt32(result, v, true); - } - return envObject.clearLastError(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippppp */ - function napi_new_instance(env, constructor, argc, argv, result) { - var i; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!constructor) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - argc = argc >>> 0; - if (argc > 0) { - if (!argv) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var Ctor = emnapiCtx.handleStore.get(constructor).value; - if (typeof Ctor !== 'function') - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var ret = void 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (emnapiCtx.feature.supportReflect) { - var argList = Array(argc); - for (i = 0; i < argc; i++) { - var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); - argList[i] = emnapiCtx.handleStore.get(argVal).value; - } - ret = Reflect.construct(Ctor, argList, Ctor); - } - else { - var args = Array(argc + 1); - args[0] = undefined; - for (i = 0; i < argc; i++) { - var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); - args[i + 1] = emnapiCtx.handleStore.get(argVal).value; - } - var BoundCtor = Ctor.bind.apply(Ctor, args); - ret = new BoundCtor(); - } - if (result) { - v = envObject.ensureHandleId(ret); - HEAP_DATA_VIEW.setInt32(result, v, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_get_new_target(env, cbinfo, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!cbinfo) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = cbinfoValue.getNewTarget(envObject); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - var functionMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_call_function: napi_call_function, - napi_create_function: napi_create_function, - napi_get_cb_info: napi_get_cb_info, - napi_get_new_target: napi_get_new_target, - napi_new_instance: napi_new_instance - }); - /** @__sig ipp */ - function napi_open_handle_scope(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var scope = emnapiCtx.openScope(envObject); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, scope.id, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_close_handle_scope(env, scope) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!scope) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if ((envObject.openHandleScopes === 0)) { - return 13 /* napi_status.napi_handle_scope_mismatch */; - } - emnapiCtx.closeScope(envObject); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_open_escapable_handle_scope(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var scope = emnapiCtx.openScope(envObject); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, scope.id, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_close_escapable_handle_scope(env, scope) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!scope) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if ((envObject.openHandleScopes === 0)) { - return 13 /* napi_status.napi_handle_scope_mismatch */; - } - emnapiCtx.closeScope(envObject); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function napi_escape_handle(env, scope, escapee, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!scope) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!escapee) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var scopeObject = emnapiCtx.scopeStore.get(scope); - if (!scopeObject.escapeCalled()) { - var newHandle = scopeObject.escape(escapee); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value = newHandle ? newHandle.id : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.clearLastError(); - } - return envObject.setLastError(12 /* napi_status.napi_escape_called_twice */); - } - /** @__sig ippip */ - function napi_create_reference(env, value, initial_refcount, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (envObject.moduleApiVersion !== 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */) { - if (!(handle.isObject() || handle.isFunction() || handle.isSymbol())) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var ref = emnapiCtx.createReference(envObject, handle.id, initial_refcount >>> 0, 1 /* Ownership.kUserland */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, ref.id, true); - return envObject.clearLastError(); - } - /** @__sig ipp */ - function napi_delete_reference(env, ref) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!ref) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiCtx.refStore.get(ref).dispose(); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_reference_ref(env, ref, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!ref) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var count = emnapiCtx.refStore.get(ref).ref(); - if (result) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(result, count, true); - } - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_reference_unref(env, ref, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!ref) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var reference = emnapiCtx.refStore.get(ref); - var refcount = reference.refCount(); - if (refcount === 0) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var count = reference.unref(); - if (result) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(result, count, true); - } - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_get_reference_value(env, ref, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!ref) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var reference = emnapiCtx.refStore.get(ref); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var handleId = reference.get(); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, handleId, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_add_env_cleanup_hook(env, fun, arg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!fun) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiCtx.addCleanupHook(envObject, fun, arg); - return 0 /* napi_status.napi_ok */; - } - /** @__sig ippp */ - function napi_remove_env_cleanup_hook(env, fun, arg) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!fun) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - emnapiCtx.removeCleanupHook(envObject, fun, arg); - return 0 /* napi_status.napi_ok */; - } - /** @__sig vp */ - function _emnapi_env_ref(env) { - var envObject = emnapiCtx.envStore.get(env); - envObject.ref(); - } - /** @__sig vp */ - function _emnapi_env_unref(env) { - var envObject = emnapiCtx.envStore.get(env); - envObject.unref(); - } - var lifeMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - _emnapi_env_ref: _emnapi_env_ref, - _emnapi_env_unref: _emnapi_env_unref, - napi_add_env_cleanup_hook: napi_add_env_cleanup_hook, - napi_close_escapable_handle_scope: napi_close_escapable_handle_scope, - napi_close_handle_scope: napi_close_handle_scope, - napi_create_reference: napi_create_reference, - napi_delete_reference: napi_delete_reference, - napi_escape_handle: napi_escape_handle, - napi_get_reference_value: napi_get_reference_value, - napi_open_escapable_handle_scope: napi_open_escapable_handle_scope, - napi_open_handle_scope: napi_open_handle_scope, - napi_reference_ref: napi_reference_ref, - napi_reference_unref: napi_reference_unref, - napi_remove_env_cleanup_hook: napi_remove_env_cleanup_hook - }); - /** @__sig ippi */ - function _emnapi_get_filename(env, buf, len) { - var envObject = emnapiCtx.envStore.get(env); - var filename = envObject.filename; - if (!buf) { - return emnapiString.lengthBytesUTF8(filename); - } - return emnapiString.stringToUTF8(filename, buf, len); - } - var miscellaneousMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - _emnapi_get_filename: _emnapi_get_filename - }); - /** @__sig ippp */ - function napi_create_promise(env, deferred, promise) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var deferredObjectId, value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!deferred) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!promise) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - var p = new Promise(function (resolve, reject) { - var deferredObject = emnapiCtx.createDeferred({ resolve: resolve, reject: reject }); - deferredObjectId = deferredObject.id; - HEAP_DATA_VIEW.setInt32(deferred, deferredObjectId, true); - }); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = emnapiCtx.addToCurrentScope(p).id; - HEAP_DATA_VIEW.setInt32(promise, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_resolve_deferred(env, deferred, resolution) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!deferred) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!resolution) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var deferredObject = emnapiCtx.deferredStore.get(deferred); - deferredObject.resolve(emnapiCtx.handleStore.get(resolution).value); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_reject_deferred(env, deferred, resolution) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!deferred) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!resolution) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var deferredObject = emnapiCtx.deferredStore.get(deferred); - deferredObject.reject(emnapiCtx.handleStore.get(resolution).value); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_is_promise(env, value, is_promise) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!is_promise) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isPromise() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(is_promise, r, true); - return envObject.clearLastError(); - } - var promiseMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_create_promise: napi_create_promise, - napi_is_promise: napi_is_promise, - napi_reject_deferred: napi_reject_deferred, - napi_resolve_deferred: napi_resolve_deferred - }); - /** @__sig ippiiip */ - function napi_get_all_property_names(env, object, key_mode, key_filter, key_conversion, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var obj = void 0; - try { - obj = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - if (key_mode !== 0 /* napi_key_collection_mode.napi_key_include_prototypes */ && key_mode !== 1 /* napi_key_collection_mode.napi_key_own_only */) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (key_conversion !== 0 /* napi_key_conversion.napi_key_keep_numbers */ && key_conversion !== 1 /* napi_key_conversion.napi_key_numbers_to_strings */) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var props = []; - var names = void 0; - var symbols = void 0; - var i = void 0; - var own = true; - var integerIndiceRegex = /^(0|[1-9][0-9]*)$/; - do { - names = Object.getOwnPropertyNames(obj); - symbols = Object.getOwnPropertySymbols(obj); - for (i = 0; i < names.length; i++) { - props.push({ - name: integerIndiceRegex.test(names[i]) ? Number(names[i]) : names[i], - desc: Object.getOwnPropertyDescriptor(obj, names[i]), - own: own - }); - } - for (i = 0; i < symbols.length; i++) { - props.push({ - name: symbols[i], - desc: Object.getOwnPropertyDescriptor(obj, symbols[i]), - own: own - }); - } - if (key_mode === 1 /* napi_key_collection_mode.napi_key_own_only */) { - break; - } - obj = Object.getPrototypeOf(obj); - own = false; - } while (obj); - var ret = []; - var addName = function (ret, name, key_filter, conversion_mode) { - if (ret.indexOf(name) !== -1) - return; - if (conversion_mode === 0 /* napi_key_conversion.napi_key_keep_numbers */) { - ret.push(name); - } - else if (conversion_mode === 1 /* napi_key_conversion.napi_key_numbers_to_strings */) { - var realName = typeof name === 'number' ? String(name) : name; - if (typeof realName === 'string') { - if (!(key_filter & 8 /* napi_key_filter.napi_key_skip_strings */)) { - ret.push(realName); - } - } - else { - ret.push(realName); - } - } - }; - for (i = 0; i < props.length; i++) { - var prop = props[i]; - var name_1 = prop.name; - var desc = prop.desc; - if (key_filter === 0 /* napi_key_filter.napi_key_all_properties */) { - addName(ret, name_1, key_filter, key_conversion); - } - else { - if (key_filter & 8 /* napi_key_filter.napi_key_skip_strings */ && typeof name_1 === 'string') { - continue; - } - if (key_filter & 16 /* napi_key_filter.napi_key_skip_symbols */ && typeof name_1 === 'symbol') { - continue; - } - var shouldAdd = true; - switch (key_filter & 7) { - case 1 /* napi_key_filter.napi_key_writable */: { - shouldAdd = Boolean(desc.writable); - break; - } - case 2 /* napi_key_filter.napi_key_enumerable */: { - shouldAdd = Boolean(desc.enumerable); - break; - } - case (1 /* napi_key_filter.napi_key_writable */ | 2 /* napi_key_filter.napi_key_enumerable */): { - shouldAdd = Boolean(desc.writable && desc.enumerable); - break; - } - case 4 /* napi_key_filter.napi_key_configurable */: { - shouldAdd = Boolean(desc.configurable); - break; - } - case (4 /* napi_key_filter.napi_key_configurable */ | 1 /* napi_key_filter.napi_key_writable */): { - shouldAdd = Boolean(desc.configurable && desc.writable); - break; - } - case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */): { - shouldAdd = Boolean(desc.configurable && desc.enumerable); - break; - } - case (4 /* napi_key_filter.napi_key_configurable */ | 2 /* napi_key_filter.napi_key_enumerable */ | 1 /* napi_key_filter.napi_key_writable */): { - shouldAdd = Boolean(desc.configurable && desc.enumerable && desc.writable); - break; - } - } - if (shouldAdd) { - addName(ret, name_1, key_filter, key_conversion); - } - } - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = emnapiCtx.addToCurrentScope(ret).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_get_property_names(env, object, result) { - return napi_get_all_property_names(env, object, 0 /* napi_key_collection_mode.napi_key_include_prototypes */, 2 /* napi_key_filter.napi_key_enumerable */ | 16 /* napi_key_filter.napi_key_skip_symbols */, 1 /* napi_key_conversion.napi_key_numbers_to_strings */, result); - } - /** @__sig ipppp */ - function napi_set_property(env, object, key, value) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!key) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - h.value[emnapiCtx.handleStore.get(key).value] = emnapiCtx.handleStore.get(value).value; - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_has_property(env, object, key, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!key) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - r = (emnapiCtx.handleStore.get(key).value in v) ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_get_property(env, object, key, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!key) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = envObject.ensureHandleId(v[emnapiCtx.handleStore.get(key).value]); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_delete_property(env, object, key, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!key) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - var propertyKey = emnapiCtx.handleStore.get(key).value; - if (emnapiCtx.feature.supportReflect) { - r = Reflect.deleteProperty(h.value, propertyKey); - } - else { - try { - r = delete h.value[propertyKey]; - } - catch (_) { - r = false; - } - } - if (result) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_has_own_property(env, object, key, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!key) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - var prop = emnapiCtx.handleStore.get(key).value; - if (typeof prop !== 'string' && typeof prop !== 'symbol') { - return envObject.setLastError(4 /* napi_status.napi_name_expected */); - } - r = Object.prototype.hasOwnProperty.call(v, emnapiCtx.handleStore.get(key).value); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_set_named_property(env, object, cname, value) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - if (!cname) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - emnapiCtx.handleStore.get(object).value[emnapiString.UTF8ToString(cname, -1)] = emnapiCtx.handleStore.get(value).value; - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_has_named_property(env, object, utf8name, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!utf8name) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - r = emnapiString.UTF8ToString(utf8name, -1) in v; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_get_named_property(env, object, utf8name, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!utf8name) { - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = envObject.ensureHandleId(v[emnapiString.UTF8ToString(utf8name, -1)]); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippip */ - function napi_set_element(env, object, index, value) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - h.value[index >>> 0] = emnapiCtx.handleStore.get(value).value; - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippip */ - function napi_has_element(env, object, index, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - r = ((index >>> 0) in v) ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippip */ - function napi_get_element(env, object, index, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (h.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - var v = void 0; - try { - v = h.isObject() || h.isFunction() ? h.value : Object(h.value); - } - catch (_) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = envObject.ensureHandleId(v[index >>> 0]); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippip */ - function napi_delete_element(env, object, index, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - if (emnapiCtx.feature.supportReflect) { - r = Reflect.deleteProperty(h.value, index >>> 0); - } - else { - try { - r = delete h.value[index >>> 0]; - } - catch (_) { - r = false; - } - } - if (result) { - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_define_properties(env, object, property_count, properties) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var propPtr, attributes; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - property_count = property_count >>> 0; - if (property_count > 0) { - if (!properties) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - var maybeObject = h.value; - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - var propertyName = void 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - for (var i = 0; i < property_count; i++) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - propPtr = properties + (i * (4 * 8)); - var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); - var name_2 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); - var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); - var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); - var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); - var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); - attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); - var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); - if (utf8Name) { - propertyName = emnapiString.UTF8ToString(utf8Name, -1); - } - else { - if (!name_2) { - return envObject.setLastError(4 /* napi_status.napi_name_expected */); - } - propertyName = emnapiCtx.handleStore.get(name_2).value; - if (typeof propertyName !== 'string' && typeof propertyName !== 'symbol') { - return envObject.setLastError(4 /* napi_status.napi_name_expected */); - } - } - emnapiDefineProperty(envObject, maybeObject, propertyName, method, getter, setter, value, attributes, data); - } - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipp */ - function napi_object_freeze(env, object) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - var maybeObject = h.value; - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - Object.freeze(maybeObject); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipp */ - function napi_object_seal(env, object) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(object); - var maybeObject = h.value; - if (!(h.isObject() || h.isFunction())) { - return envObject.setLastError(2 /* napi_status.napi_object_expected */); - } - Object.seal(maybeObject); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - var propertyMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_define_properties: napi_define_properties, - napi_delete_element: napi_delete_element, - napi_delete_property: napi_delete_property, - napi_get_all_property_names: napi_get_all_property_names, - napi_get_element: napi_get_element, - napi_get_named_property: napi_get_named_property, - napi_get_property: napi_get_property, - napi_get_property_names: napi_get_property_names, - napi_has_element: napi_has_element, - napi_has_named_property: napi_has_named_property, - napi_has_own_property: napi_has_own_property, - napi_has_property: napi_has_property, - napi_object_freeze: napi_object_freeze, - napi_object_seal: napi_object_seal, - napi_set_element: napi_set_element, - napi_set_named_property: napi_set_named_property, - napi_set_property: napi_set_property - }); - /** @__sig ippp */ - function napi_run_script(env, script, result) { - var status; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var value; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!script) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var v8Script = emnapiCtx.handleStore.get(script); - if (!v8Script.isString()) { - return envObject.setLastError(3 /* napi_status.napi_string_expected */); - } - var g = emnapiCtx.handleStore.get(5 /* GlobalHandle.GLOBAL */).value; - var ret = g.eval(v8Script.value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - value = envObject.ensureHandleId(ret); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, value, true); - status = envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - return status; - } - var scriptMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_run_script: napi_run_script - }); - /** @__sig ippp */ - function napi_typeof(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var v = emnapiCtx.handleStore.get(value); - var r; - if (v.isNumber()) { - r = 3 /* napi_valuetype.napi_number */; - } - else if (v.isBigInt()) { - r = 9 /* napi_valuetype.napi_bigint */; - } - else if (v.isString()) { - r = 4 /* napi_valuetype.napi_string */; - } - else if (v.isFunction()) { - // This test has to come before IsObject because IsFunction - // implies IsObject - r = 7 /* napi_valuetype.napi_function */; - } - else if (v.isExternal()) { - // This test has to come before IsObject because IsExternal - // implies IsObject - r = 8 /* napi_valuetype.napi_external */; - } - else if (v.isObject()) { - r = 6 /* napi_valuetype.napi_object */; - } - else if (v.isBoolean()) { - r = 2 /* napi_valuetype.napi_boolean */; - } - else if (v.isUndefined()) { - r = 0 /* napi_valuetype.napi_undefined */; - } - else if (v.isSymbol()) { - r = 5 /* napi_valuetype.napi_symbol */; - } - else if (v.isNull()) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - r = 1 /* napi_valuetype.napi_null */; - } - else { - // Should not get here unless V8 has added some new kind of value. - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - } - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_coerce_to_bool(env, value, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - v = handle.value ? 4 /* GlobalHandle.TRUE */ : 3 /* GlobalHandle.FALSE */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_coerce_to_number(env, value, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (handle.isBigInt()) { - throw new TypeError('Cannot convert a BigInt value to a number'); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = emnapiCtx.addToCurrentScope(Number(handle.value)).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_coerce_to_object(env, value, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (handle.value == null) { - throw new TypeError('Cannot convert undefined or null to object'); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = envObject.ensureHandleId(Object(handle.value)); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_coerce_to_string(env, value, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var v; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var handle = emnapiCtx.handleStore.get(value); - if (handle.isSymbol()) { - throw new TypeError('Cannot convert a Symbol value to a string'); - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - v = emnapiCtx.addToCurrentScope(String(handle.value)).id; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt32(result, v, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipppp */ - function napi_instanceof(env, object, constructor, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!object) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!constructor) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, 0, true); - var ctor = emnapiCtx.handleStore.get(constructor); - if (!ctor.isFunction()) { - return envObject.setLastError(5 /* napi_status.napi_function_expected */); - } - var val = emnapiCtx.handleStore.get(object).value; - var ret = val instanceof ctor.value; - r = ret ? 1 : 0; - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ippp */ - function napi_is_array(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isArray() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_arraybuffer(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isArrayBuffer() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_date(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isDate() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_error(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var val = emnapiCtx.handleStore.get(value).value; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = (val instanceof Error) ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_typedarray(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isTypedArray() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_buffer(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isBuffer() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_dataview(env, value, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!value) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(value); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r = h.isDataView() ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.clearLastError(); - } - /** @__sig ipppp */ - function napi_strict_equals(env, lhs, rhs, result) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var r; - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!lhs) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!rhs) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var lv = emnapiCtx.handleStore.get(lhs).value; - var rv = emnapiCtx.handleStore.get(rhs).value; - r = (lv === rv) ? 1 : 0; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setInt8(result, r, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - /** @__sig ipp */ - function napi_detach_arraybuffer(env, arraybuffer) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!arraybuffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var value = emnapiCtx.handleStore.get(arraybuffer).value; - if (!(value instanceof ArrayBuffer)) { - if (typeof SharedArrayBuffer === 'function' && (value instanceof SharedArrayBuffer)) { - return envObject.setLastError(20 /* napi_status.napi_detachable_arraybuffer_expected */); - } - return envObject.setLastError(19 /* napi_status.napi_arraybuffer_expected */); - } - try { - var MessageChannel_1 = emnapiCtx.feature.MessageChannel; - var messageChannel = new MessageChannel_1(); - messageChannel.port1.postMessage(value, [value]); - } - catch (_) { - return envObject.setLastError(9 /* napi_status.napi_generic_failure */); - } - return envObject.clearLastError(); - } - /** @__sig ippp */ - function napi_is_detached_arraybuffer(env, arraybuffer, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - // @ts-expect-error - var envObject = emnapiCtx.envStore.get(env); - envObject.checkGCAccess(); - if (!envObject.tryCatch.isEmpty()) - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - if (!envObject.canCallIntoJs()) - return envObject.setLastError(envObject.moduleApiVersion === 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ ? 23 /* napi_status.napi_cannot_run_js */ : 10 /* napi_status.napi_pending_exception */); - envObject.clearLastError(); - try { - if (!arraybuffer) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - var h = emnapiCtx.handleStore.get(arraybuffer); - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - if (h.isArrayBuffer() && h.value.byteLength === 0) { - try { - // eslint-disable-next-line no-new - new Uint8Array(h.value); - } - catch (_) { - HEAP_DATA_VIEW.setInt8(result, 1, true); - return envObject.getReturnStatus(); - } - } - HEAP_DATA_VIEW.setInt8(result, 0, true); - return envObject.getReturnStatus(); - } - catch (err) { - envObject.tryCatch.setError(err); - return envObject.setLastError(10 /* napi_status.napi_pending_exception */); - } - } - var valueOperationMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_coerce_to_bool: napi_coerce_to_bool, - napi_coerce_to_number: napi_coerce_to_number, - napi_coerce_to_object: napi_coerce_to_object, - napi_coerce_to_string: napi_coerce_to_string, - napi_detach_arraybuffer: napi_detach_arraybuffer, - napi_instanceof: napi_instanceof, - napi_is_array: napi_is_array, - napi_is_arraybuffer: napi_is_arraybuffer, - napi_is_buffer: napi_is_buffer, - napi_is_dataview: napi_is_dataview, - napi_is_date: napi_is_date, - napi_is_detached_arraybuffer: napi_is_detached_arraybuffer, - napi_is_error: napi_is_error, - napi_is_typedarray: napi_is_typedarray, - napi_strict_equals: napi_strict_equals, - napi_typeof: napi_typeof - }); - /** @__sig ipp */ - function napi_get_version(env, result) { - if (!env) - return 1 /* napi_status.napi_invalid_arg */; - var envObject = emnapiCtx.envStore.get(env); - if (!result) - return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - var NODE_API_SUPPORTED_VERSION_MAX = 9 /* Version.NODE_API_SUPPORTED_VERSION_MAX */; - var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); - HEAP_DATA_VIEW.setUint32(result, NODE_API_SUPPORTED_VERSION_MAX, true); - return envObject.clearLastError(); - } - var versionMod = /*#__PURE__*/ Object.freeze({ - __proto__: null, - napi_get_version: napi_get_version + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(dataview).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** + * @__sig ipppp + */ + function node_api_symbol_for(env, utf8description, length, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var autoLength = length === -1; + var sizelength = length >>> 0; + if (length !== 0) { + if (!utf8description) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!(autoLength || sizelength <= 2147483647)) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var descriptionString = emnapiString.UTF8ToString( + utf8description, + length, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(Symbol.for(descriptionString)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var createMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_array: napi_create_array, + napi_create_array_with_length: napi_create_array_with_length, + napi_create_arraybuffer: napi_create_arraybuffer, + napi_create_buffer: napi_create_buffer, + napi_create_buffer_copy: napi_create_buffer_copy, + napi_create_dataview: napi_create_dataview, + napi_create_date: napi_create_date, + napi_create_external: napi_create_external, + napi_create_external_arraybuffer: napi_create_external_arraybuffer, + napi_create_external_buffer: napi_create_external_buffer, + napi_create_object: napi_create_object, + napi_create_symbol: napi_create_symbol, + napi_create_typedarray: napi_create_typedarray, + node_api_symbol_for: node_api_symbol_for, + }); + /** @__sig ipip */ + function napi_get_boolean(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = + value === 0 ? 3 /* GlobalHandle.FALSE */ : 4; /* GlobalHandle.TRUE */ + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_global(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 5; /* GlobalHandle.GLOBAL */ + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_null(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 2; /* GlobalHandle.NULL */ + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_undefined(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = 1; /* GlobalHandle.UNDEFINED */ + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var globalMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_boolean: napi_get_boolean, + napi_get_global: napi_get_global, + napi_get_null: napi_get_null, + napi_get_undefined: napi_get_undefined, + }); + /** @__sig ipppp */ + function napi_set_instance_data(env, data, finalize_cb, finalize_hint) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + envObject.setInstanceData(data, finalize_cb, finalize_hint); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_instance_data(env, data) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!data) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = envObject.getInstanceData(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(data, value, true); + return envObject.clearLastError(); + } + var envMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_instance_data: napi_get_instance_data, + napi_set_instance_data: napi_set_instance_data, + }); + /** @__sig vpppp */ + function _emnapi_get_last_error_info( + env, + error_code, + engine_error_code, + engine_reserved, + ) { + var envObject = emnapiCtx.envStore.get(env); + var lastError = envObject.lastError; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var errorCode = lastError.errorCode; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var engineErrorCode = lastError.engineErrorCode >>> 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var engineReserved = lastError.engineReserved; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(error_code, errorCode, true); + HEAP_DATA_VIEW.setUint32(engine_error_code, engineErrorCode, true); + HEAP_DATA_VIEW.setInt32(engine_reserved, engineReserved, true); + } + /** @__sig ipp */ + function napi_throw(env, error) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!error) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + envObject.tryCatch.setError(emnapiCtx.handleStore.get(error).value); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_throw_error(env, code, msg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new Error(emnapiString.UTF8ToString(msg, -1)); + if (code) error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_throw_type_error(env, code, msg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new TypeError(emnapiString.UTF8ToString(msg, -1)); + if (code) error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_throw_range_error(env, code, msg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new RangeError(emnapiString.UTF8ToString(msg, -1)); + if (code) error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function node_api_throw_syntax_error(env, code, msg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = new SyntaxError(emnapiString.UTF8ToString(msg, -1)); + if (code) error.code = emnapiString.UTF8ToString(code, -1); + envObject.tryCatch.setError(error); + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipp */ + function napi_is_exception_pending(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = envObject.tryCatch.hasCaught(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_error(env, code, msg, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new Error(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_type_error(env, code, msg, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new TypeError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_create_range_error(env, code, msg, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new RangeError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function node_api_create_syntax_error(env, code, msg, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!msg) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var msgValue = emnapiCtx.handleStore.get(msg).value; + if (typeof msgValue !== 'string') { + return envObject.setLastError(3 /* napi_status.napi_string_expected */); + } + var error = new SyntaxError(msgValue); + if (code) { + var codeValue = emnapiCtx.handleStore.get(code).value; + if (typeof codeValue !== 'string') { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + error.code = codeValue; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = emnapiCtx.addToCurrentScope(error).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_get_and_clear_last_exception(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (!envObject.tryCatch.hasCaught()) { + HEAP_DATA_VIEW.setInt32(result, 1, true); // ID_UNDEFINED + return envObject.clearLastError(); + } else { + var err = envObject.tryCatch.exception(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = envObject.ensureHandleId(err); + HEAP_DATA_VIEW.setInt32(result, value, true); + envObject.tryCatch.reset(); + } + return envObject.clearLastError(); + } + /** @__sig vpppp */ + function napi_fatal_error(location, location_len, message, message_len) { + var locationStr = emnapiString.UTF8ToString(location, location_len); + var messageStr = emnapiString.UTF8ToString(message, message_len); + if (emnapiNodeBinding) { + emnapiNodeBinding.napi.fatalError(locationStr, messageStr); + } else { + abort('FATAL ERROR: ' + locationStr + ' ' + messageStr); + } + } + /** @__sig ipp */ + function napi_fatal_exception(env, err) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!err) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var error = envObject.ctx.handleStore.get(err); + try { + envObject.triggerFatalException(error.value); + } catch (_) { + return envObject.setLastError( + 9 /* napi_status.napi_generic_failure */, + ); + } + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + var errorMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_get_last_error_info: _emnapi_get_last_error_info, + napi_create_error: napi_create_error, + napi_create_range_error: napi_create_range_error, + napi_create_type_error: napi_create_type_error, + napi_fatal_error: napi_fatal_error, + napi_fatal_exception: napi_fatal_exception, + napi_get_and_clear_last_exception: napi_get_and_clear_last_exception, + napi_is_exception_pending: napi_is_exception_pending, + napi_throw: napi_throw, + napi_throw_error: napi_throw_error, + napi_throw_range_error: napi_throw_range_error, + napi_throw_type_error: napi_throw_type_error, + node_api_create_syntax_error: node_api_create_syntax_error, + node_api_throw_syntax_error: node_api_throw_syntax_error, + }); + /** @__sig ipppppp */ + function napi_create_function(env, utf8name, length, cb, data, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!cb) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var fresult = emnapiCreateFunction( + envObject, + utf8name, + length, + cb, + data, + ); + if (fresult.status !== 0 /* napi_status.napi_ok */) + return envObject.setLastError(fresult.status); + var f = fresult.f; + var valueHandle = emnapiCtx.addToCurrentScope(f); + value = valueHandle.id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppppp */ + function napi_get_cb_info(env, cbinfo, argc, argv, this_arg, data) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!cbinfo) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (argv) { + if (!argc) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var argcValue = HEAP_DATA_VIEW.getUint32(argc, true); + var len = cbinfoValue.args.length; + var arrlen = argcValue < len ? argcValue : len; + var i = 0; + for (; i < arrlen; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var argVal = envObject.ensureHandleId(cbinfoValue.args[i]); + HEAP_DATA_VIEW.setInt32(argv + i * 4, argVal, true); + } + if (i < argcValue) { + for (; i < argcValue; i++) { + HEAP_DATA_VIEW.setInt32(argv + i * 4, 1, true); + } + } + } + if (argc) { + HEAP_DATA_VIEW.setUint32(argc, cbinfoValue.args.length, true); + } + if (this_arg) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v = envObject.ensureHandleId(cbinfoValue.thiz); + HEAP_DATA_VIEW.setInt32(this_arg, v, true); + } + if (data) { + HEAP_DATA_VIEW.setInt32(data, cbinfoValue.data, true); + } + return envObject.clearLastError(); + } + /** @__sig ipppppp */ + function napi_call_function(env, recv, func, argc, argv, result) { + var i = 0; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!recv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + argc = argc >>> 0; + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var v8recv = emnapiCtx.handleStore.get(recv).value; + if (!func) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v8func = emnapiCtx.handleStore.get(func).value; + if (typeof v8func !== 'function') + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var args = []; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + args.push(emnapiCtx.handleStore.get(argVal).value); + } + var ret = v8func.apply(v8recv, args); + if (result) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.clearLastError(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippppp */ + function napi_new_instance(env, constructor, argc, argv, result) { + var i; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + argc = argc >>> 0; + if (argc > 0) { + if (!argv) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var Ctor = emnapiCtx.handleStore.get(constructor).value; + if (typeof Ctor !== 'function') + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var ret = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (emnapiCtx.feature.supportReflect) { + var argList = Array(argc); + for (i = 0; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + argList[i] = emnapiCtx.handleStore.get(argVal).value; + } + ret = Reflect.construct(Ctor, argList, Ctor); + } else { + var args = Array(argc + 1); + args[0] = undefined; + for (i = 0; i < argc; i++) { + var argVal = HEAP_DATA_VIEW.getInt32(argv + i * 4, true); + args[i + 1] = emnapiCtx.handleStore.get(argVal).value; + } + var BoundCtor = Ctor.bind.apply(Ctor, args); + ret = new BoundCtor(); + } + if (result) { + v = envObject.ensureHandleId(ret); + HEAP_DATA_VIEW.setInt32(result, v, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_get_new_target(env, cbinfo, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!cbinfo) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var cbinfoValue = emnapiCtx.cbinfoStack.get(cbinfo); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = cbinfoValue.getNewTarget(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + var functionMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_call_function: napi_call_function, + napi_create_function: napi_create_function, + napi_get_cb_info: napi_get_cb_info, + napi_get_new_target: napi_get_new_target, + napi_new_instance: napi_new_instance, + }); + /** @__sig ipp */ + function napi_open_handle_scope(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var scope = emnapiCtx.openScope(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, scope.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_close_handle_scope(env, scope) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (envObject.openHandleScopes === 0) { + return 13 /* napi_status.napi_handle_scope_mismatch */; + } + emnapiCtx.closeScope(envObject); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_open_escapable_handle_scope(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var scope = emnapiCtx.openScope(envObject); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, scope.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_close_escapable_handle_scope(env, scope) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (envObject.openHandleScopes === 0) { + return 13 /* napi_status.napi_handle_scope_mismatch */; + } + emnapiCtx.closeScope(envObject); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_escape_handle(env, scope, escapee, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!scope) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!escapee) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var scopeObject = emnapiCtx.scopeStore.get(scope); + if (!scopeObject.escapeCalled()) { + var newHandle = scopeObject.escape(escapee); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value = newHandle ? newHandle.id : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.clearLastError(); + } + return envObject.setLastError( + 12 /* napi_status.napi_escape_called_twice */, + ); + } + /** @__sig ippip */ + function napi_create_reference(env, value, initial_refcount, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if ( + envObject.moduleApiVersion !== + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ) { + if (!(handle.isObject() || handle.isFunction() || handle.isSymbol())) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var ref = emnapiCtx.createReference( + envObject, + handle.id, + initial_refcount >>> 0, + 1 /* Ownership.kUserland */, + ); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, ref.id, true); + return envObject.clearLastError(); + } + /** @__sig ipp */ + function napi_delete_reference(env, ref) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.refStore.get(ref).dispose(); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_reference_ref(env, ref, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var count = emnapiCtx.refStore.get(ref).ref(); + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, count, true); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_reference_unref(env, ref, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var reference = emnapiCtx.refStore.get(ref); + var refcount = reference.refCount(); + if (refcount === 0) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var count = reference.unref(); + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, count, true); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_get_reference_value(env, ref, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!ref) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var reference = emnapiCtx.refStore.get(ref); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var handleId = reference.get(); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, handleId, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_add_env_cleanup_hook(env, fun, arg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!fun) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.addCleanupHook(envObject, fun, arg); + return 0 /* napi_status.napi_ok */; + } + /** @__sig ippp */ + function napi_remove_env_cleanup_hook(env, fun, arg) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!fun) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + emnapiCtx.removeCleanupHook(envObject, fun, arg); + return 0 /* napi_status.napi_ok */; + } + /** @__sig vp */ + function _emnapi_env_ref(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.ref(); + } + /** @__sig vp */ + function _emnapi_env_unref(env) { + var envObject = emnapiCtx.envStore.get(env); + envObject.unref(); + } + var lifeMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_env_ref: _emnapi_env_ref, + _emnapi_env_unref: _emnapi_env_unref, + napi_add_env_cleanup_hook: napi_add_env_cleanup_hook, + napi_close_escapable_handle_scope: napi_close_escapable_handle_scope, + napi_close_handle_scope: napi_close_handle_scope, + napi_create_reference: napi_create_reference, + napi_delete_reference: napi_delete_reference, + napi_escape_handle: napi_escape_handle, + napi_get_reference_value: napi_get_reference_value, + napi_open_escapable_handle_scope: napi_open_escapable_handle_scope, + napi_open_handle_scope: napi_open_handle_scope, + napi_reference_ref: napi_reference_ref, + napi_reference_unref: napi_reference_unref, + napi_remove_env_cleanup_hook: napi_remove_env_cleanup_hook, + }); + /** @__sig ippi */ + function _emnapi_get_filename(env, buf, len) { + var envObject = emnapiCtx.envStore.get(env); + var filename = envObject.filename; + if (!buf) { + return emnapiString.lengthBytesUTF8(filename); + } + return emnapiString.stringToUTF8(filename, buf, len); + } + var miscellaneousMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + _emnapi_get_filename: _emnapi_get_filename, + }); + /** @__sig ippp */ + function napi_create_promise(env, deferred, promise) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var deferredObjectId, value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!promise) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + var p = new Promise(function (resolve, reject) { + var deferredObject = emnapiCtx.createDeferred({ + resolve: resolve, + reject: reject, + }); + deferredObjectId = deferredObject.id; + HEAP_DATA_VIEW.setInt32(deferred, deferredObjectId, true); }); - emnapiAWST.init(); - emnapiExternalMemory.init(); - emnapiString.init(); - emnapiTSFN.init(); - napiModule.emnapi.syncMemory = $emnapiSyncMemory; - napiModule.emnapi.getMemoryAddress = $emnapiGetMemoryAddress; - function addImports(mod) { - var keys = Object.keys(mod); - for (var i = 0; i < keys.length; ++i) { - var k = keys[i]; - if (k.indexOf('$') === 0) - continue; - if (k.indexOf('emnapi_') === 0) { - napiModule.imports.emnapi[k] = mod[k]; - } - else if (k.indexOf('_emnapi_') === 0 || k === 'napi_set_last_error' || k === 'napi_clear_last_error') { - napiModule.imports.env[k] = mod[k]; - } - else { - napiModule.imports.napi[k] = mod[k]; - } - } - } - addImports(asyncMod); - addImports(memoryMod); - addImports(asyncWorkMod); - addImports(utilMod); - addImports(convert2cMod); - addImports(convert2napiMod); - addImports(createMod); - addImports(globalMod); - addImports(wrapMod); - addImports(envMod); - addImports(emnapiMod); - addImports(errorMod); - addImports(functionMod); - addImports(lifeMod); - addImports(miscellaneousMod); - addImports(nodeMod); - addImports(promiseMod); - addImports(propertyMod); - addImports(scriptMod); - addImports(valueOperationMod); - addImports(versionMod); - napiModule.imports.napi.napi_create_threadsafe_function = napi_create_threadsafe_function; - napiModule.imports.napi.napi_get_threadsafe_function_context = napi_get_threadsafe_function_context; - napiModule.imports.napi.napi_call_threadsafe_function = napi_call_threadsafe_function; - napiModule.imports.napi.napi_acquire_threadsafe_function = napi_acquire_threadsafe_function; - napiModule.imports.napi.napi_release_threadsafe_function = napi_release_threadsafe_function; - napiModule.imports.napi.napi_unref_threadsafe_function = napi_unref_threadsafe_function; - napiModule.imports.napi.napi_ref_threadsafe_function = napi_ref_threadsafe_function; - return napiModule; - })(); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(p).id; + HEAP_DATA_VIEW.setInt32(promise, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_resolve_deferred(env, deferred, resolution) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!resolution) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var deferredObject = emnapiCtx.deferredStore.get(deferred); + deferredObject.resolve(emnapiCtx.handleStore.get(resolution).value); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_reject_deferred(env, deferred, resolution) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!deferred) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!resolution) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var deferredObject = emnapiCtx.deferredStore.get(deferred); + deferredObject.reject(emnapiCtx.handleStore.get(resolution).value); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_is_promise(env, value, is_promise) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!is_promise) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isPromise() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(is_promise, r, true); + return envObject.clearLastError(); + } + var promiseMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_create_promise: napi_create_promise, + napi_is_promise: napi_is_promise, + napi_reject_deferred: napi_reject_deferred, + napi_resolve_deferred: napi_resolve_deferred, + }); + /** @__sig ippiiip */ + function napi_get_all_property_names( + env, + object, + key_mode, + key_filter, + key_conversion, + result, + ) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var obj = void 0; + try { + obj = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + if ( + key_mode !== + 0 /* napi_key_collection_mode.napi_key_include_prototypes */ && + key_mode !== 1 /* napi_key_collection_mode.napi_key_own_only */ + ) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if ( + key_conversion !== + 0 /* napi_key_conversion.napi_key_keep_numbers */ && + key_conversion !== + 1 /* napi_key_conversion.napi_key_numbers_to_strings */ + ) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var props = []; + var names = void 0; + var symbols = void 0; + var i = void 0; + var own = true; + var integerIndiceRegex = /^(0|[1-9][0-9]*)$/; + do { + names = Object.getOwnPropertyNames(obj); + symbols = Object.getOwnPropertySymbols(obj); + for (i = 0; i < names.length; i++) { + props.push({ + name: integerIndiceRegex.test(names[i]) + ? Number(names[i]) + : names[i], + desc: Object.getOwnPropertyDescriptor(obj, names[i]), + own: own, + }); + } + for (i = 0; i < symbols.length; i++) { + props.push({ + name: symbols[i], + desc: Object.getOwnPropertyDescriptor(obj, symbols[i]), + own: own, + }); + } + if (key_mode === 1 /* napi_key_collection_mode.napi_key_own_only */) { + break; + } + obj = Object.getPrototypeOf(obj); + own = false; + } while (obj); + var ret = []; + var addName = function (ret, name, key_filter, conversion_mode) { + if (ret.indexOf(name) !== -1) return; + if ( + conversion_mode === + 0 /* napi_key_conversion.napi_key_keep_numbers */ + ) { + ret.push(name); + } else if ( + conversion_mode === + 1 /* napi_key_conversion.napi_key_numbers_to_strings */ + ) { + var realName = typeof name === 'number' ? String(name) : name; + if (typeof realName === 'string') { + if ( + !((key_filter & 8) /* napi_key_filter.napi_key_skip_strings */) + ) { + ret.push(realName); + } + } else { + ret.push(realName); + } + } + }; + for (i = 0; i < props.length; i++) { + var prop = props[i]; + var name_1 = prop.name; + var desc = prop.desc; + if (key_filter === 0 /* napi_key_filter.napi_key_all_properties */) { + addName(ret, name_1, key_filter, key_conversion); + } else { + if ( + key_filter & 8 /* napi_key_filter.napi_key_skip_strings */ && + typeof name_1 === 'string' + ) { + continue; + } + if ( + key_filter & 16 /* napi_key_filter.napi_key_skip_symbols */ && + typeof name_1 === 'symbol' + ) { + continue; + } + var shouldAdd = true; + switch (key_filter & 7) { + case 1 /* napi_key_filter.napi_key_writable */: { + shouldAdd = Boolean(desc.writable); + break; + } + case 2 /* napi_key_filter.napi_key_enumerable */: { + shouldAdd = Boolean(desc.enumerable); + break; + } + case 1 /* napi_key_filter.napi_key_writable */ | + 2 /* napi_key_filter.napi_key_enumerable */: { + shouldAdd = Boolean(desc.writable && desc.enumerable); + break; + } + case 4 /* napi_key_filter.napi_key_configurable */: { + shouldAdd = Boolean(desc.configurable); + break; + } + case 4 /* napi_key_filter.napi_key_configurable */ | + 1 /* napi_key_filter.napi_key_writable */: { + shouldAdd = Boolean(desc.configurable && desc.writable); + break; + } + case 4 /* napi_key_filter.napi_key_configurable */ | + 2 /* napi_key_filter.napi_key_enumerable */: { + shouldAdd = Boolean(desc.configurable && desc.enumerable); + break; + } + case 4 /* napi_key_filter.napi_key_configurable */ | + 2 /* napi_key_filter.napi_key_enumerable */ | + 1 /* napi_key_filter.napi_key_writable */: { + shouldAdd = Boolean( + desc.configurable && desc.enumerable && desc.writable, + ); + break; + } + } + if (shouldAdd) { + addName(ret, name_1, key_filter, key_conversion); + } + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = emnapiCtx.addToCurrentScope(ret).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_get_property_names(env, object, result) { + return napi_get_all_property_names( + env, + object, + 0 /* napi_key_collection_mode.napi_key_include_prototypes */, + 2 /* napi_key_filter.napi_key_enumerable */ | + 16 /* napi_key_filter.napi_key_skip_symbols */, + 1 /* napi_key_conversion.napi_key_numbers_to_strings */, + result, + ); + } + /** @__sig ipppp */ + function napi_set_property(env, object, key, value) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + h.value[emnapiCtx.handleStore.get(key).value] = + emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_has_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + r = emnapiCtx.handleStore.get(key).value in v ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_get_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId( + v[emnapiCtx.handleStore.get(key).value], + ); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_delete_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + var propertyKey = emnapiCtx.handleStore.get(key).value; + if (emnapiCtx.feature.supportReflect) { + r = Reflect.deleteProperty(h.value, propertyKey); + } else { + try { + r = delete h.value[propertyKey]; + } catch (_) { + r = false; + } + } + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_has_own_property(env, object, key, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!key) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + var prop = emnapiCtx.handleStore.get(key).value; + if (typeof prop !== 'string' && typeof prop !== 'symbol') { + return envObject.setLastError(4 /* napi_status.napi_name_expected */); + } + r = Object.prototype.hasOwnProperty.call( + v, + emnapiCtx.handleStore.get(key).value, + ); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_set_named_property(env, object, cname, value) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + if (!cname) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + emnapiCtx.handleStore.get(object).value[ + emnapiString.UTF8ToString(cname, -1) + ] = emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_has_named_property(env, object, utf8name, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!utf8name) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + r = emnapiString.UTF8ToString(utf8name, -1) in v; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_get_named_property(env, object, utf8name, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!utf8name) { + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId( + v[emnapiString.UTF8ToString(utf8name, -1)], + ); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippip */ + function napi_set_element(env, object, index, value) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + h.value[index >>> 0] = emnapiCtx.handleStore.get(value).value; + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippip */ + function napi_has_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + r = index >>> 0 in v ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippip */ + function napi_get_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (h.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var v = void 0; + try { + v = h.isObject() || h.isFunction() ? h.value : Object(h.value); + } catch (_) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(v[index >>> 0]); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippip */ + function napi_delete_element(env, object, index, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + if (emnapiCtx.feature.supportReflect) { + r = Reflect.deleteProperty(h.value, index >>> 0); + } else { + try { + r = delete h.value[index >>> 0]; + } catch (_) { + r = false; + } + } + if (result) { + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r ? 1 : 0, true); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_define_properties(env, object, property_count, properties) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var propPtr, attributes; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + property_count = property_count >>> 0; + if (property_count > 0) { + if (!properties) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + var propertyName = void 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + for (var i = 0; i < property_count; i++) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + propPtr = properties + i * (4 * 8); + var utf8Name = HEAP_DATA_VIEW.getInt32(propPtr, true); + var name_2 = HEAP_DATA_VIEW.getInt32(propPtr + 4, true); + var method = HEAP_DATA_VIEW.getInt32(propPtr + 8, true); + var getter = HEAP_DATA_VIEW.getInt32(propPtr + 12, true); + var setter = HEAP_DATA_VIEW.getInt32(propPtr + 16, true); + var value = HEAP_DATA_VIEW.getInt32(propPtr + 20, true); + attributes = HEAP_DATA_VIEW.getInt32(propPtr + 24, true); + var data = HEAP_DATA_VIEW.getInt32(propPtr + 28, true); + if (utf8Name) { + propertyName = emnapiString.UTF8ToString(utf8Name, -1); + } else { + if (!name_2) { + return envObject.setLastError( + 4 /* napi_status.napi_name_expected */, + ); + } + propertyName = emnapiCtx.handleStore.get(name_2).value; + if ( + typeof propertyName !== 'string' && + typeof propertyName !== 'symbol' + ) { + return envObject.setLastError( + 4 /* napi_status.napi_name_expected */, + ); + } + } + emnapiDefineProperty( + envObject, + maybeObject, + propertyName, + method, + getter, + setter, + value, + attributes, + data, + ); + } + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipp */ + function napi_object_freeze(env, object) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + Object.freeze(maybeObject); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipp */ + function napi_object_seal(env, object) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(object); + var maybeObject = h.value; + if (!(h.isObject() || h.isFunction())) { + return envObject.setLastError( + 2 /* napi_status.napi_object_expected */, + ); + } + Object.seal(maybeObject); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + var propertyMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_define_properties: napi_define_properties, + napi_delete_element: napi_delete_element, + napi_delete_property: napi_delete_property, + napi_get_all_property_names: napi_get_all_property_names, + napi_get_element: napi_get_element, + napi_get_named_property: napi_get_named_property, + napi_get_property: napi_get_property, + napi_get_property_names: napi_get_property_names, + napi_has_element: napi_has_element, + napi_has_named_property: napi_has_named_property, + napi_has_own_property: napi_has_own_property, + napi_has_property: napi_has_property, + napi_object_freeze: napi_object_freeze, + napi_object_seal: napi_object_seal, + napi_set_element: napi_set_element, + napi_set_named_property: napi_set_named_property, + napi_set_property: napi_set_property, + }); + /** @__sig ippp */ + function napi_run_script(env, script, result) { + var status; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var value; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!script) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v8Script = emnapiCtx.handleStore.get(script); + if (!v8Script.isString()) { + return envObject.setLastError( + 3 /* napi_status.napi_string_expected */, + ); + } + var g = emnapiCtx.handleStore.get(5 /* GlobalHandle.GLOBAL */).value; + var ret = g.eval(v8Script.value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + value = envObject.ensureHandleId(ret); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, value, true); + status = envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + return status; + } + var scriptMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_run_script: napi_run_script, + }); + /** @__sig ippp */ + function napi_typeof(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var v = emnapiCtx.handleStore.get(value); + var r; + if (v.isNumber()) { + r = 3 /* napi_valuetype.napi_number */; + } else if (v.isBigInt()) { + r = 9 /* napi_valuetype.napi_bigint */; + } else if (v.isString()) { + r = 4 /* napi_valuetype.napi_string */; + } else if (v.isFunction()) { + // This test has to come before IsObject because IsFunction + // implies IsObject + r = 7 /* napi_valuetype.napi_function */; + } else if (v.isExternal()) { + // This test has to come before IsObject because IsExternal + // implies IsObject + r = 8 /* napi_valuetype.napi_external */; + } else if (v.isObject()) { + r = 6 /* napi_valuetype.napi_object */; + } else if (v.isBoolean()) { + r = 2 /* napi_valuetype.napi_boolean */; + } else if (v.isUndefined()) { + r = 0 /* napi_valuetype.napi_undefined */; + } else if (v.isSymbol()) { + r = 5 /* napi_valuetype.napi_symbol */; + } else if (v.isNull()) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + r = 1 /* napi_valuetype.napi_null */; + } else { + // Should not get here unless V8 has added some new kind of value. + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + } + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_coerce_to_bool(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + v = handle.value + ? 4 /* GlobalHandle.TRUE */ + : 3 /* GlobalHandle.FALSE */; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_coerce_to_number(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.isBigInt()) { + throw new TypeError('Cannot convert a BigInt value to a number'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = emnapiCtx.addToCurrentScope(Number(handle.value)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_coerce_to_object(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.value == null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = envObject.ensureHandleId(Object(handle.value)); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_coerce_to_string(env, value, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var v; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var handle = emnapiCtx.handleStore.get(value); + if (handle.isSymbol()) { + throw new TypeError('Cannot convert a Symbol value to a string'); + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + v = emnapiCtx.addToCurrentScope(String(handle.value)).id; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt32(result, v, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipppp */ + function napi_instanceof(env, object, constructor, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!object) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!constructor) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, 0, true); + var ctor = emnapiCtx.handleStore.get(constructor); + if (!ctor.isFunction()) { + return envObject.setLastError( + 5 /* napi_status.napi_function_expected */, + ); + } + var val = emnapiCtx.handleStore.get(object).value; + var ret = val instanceof ctor.value; + r = ret ? 1 : 0; + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ippp */ + function napi_is_array(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isArray() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_arraybuffer(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isArrayBuffer() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_date(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isDate() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_error(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var val = emnapiCtx.handleStore.get(value).value; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = val instanceof Error ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_typedarray(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isTypedArray() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_buffer(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isBuffer() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_dataview(env, value, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!value) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(value); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r = h.isDataView() ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.clearLastError(); + } + /** @__sig ipppp */ + function napi_strict_equals(env, lhs, rhs, result) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var r; + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!lhs) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!rhs) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var lv = emnapiCtx.handleStore.get(lhs).value; + var rv = emnapiCtx.handleStore.get(rhs).value; + r = lv === rv ? 1 : 0; + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setInt8(result, r, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + /** @__sig ipp */ + function napi_detach_arraybuffer(env, arraybuffer) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var value = emnapiCtx.handleStore.get(arraybuffer).value; + if (!(value instanceof ArrayBuffer)) { + if ( + typeof SharedArrayBuffer === 'function' && + value instanceof SharedArrayBuffer + ) { + return envObject.setLastError( + 20 /* napi_status.napi_detachable_arraybuffer_expected */, + ); + } + return envObject.setLastError( + 19 /* napi_status.napi_arraybuffer_expected */, + ); + } + try { + var MessageChannel_1 = emnapiCtx.feature.MessageChannel; + var messageChannel = new MessageChannel_1(); + messageChannel.port1.postMessage(value, [value]); + } catch (_) { + return envObject.setLastError(9 /* napi_status.napi_generic_failure */); + } + return envObject.clearLastError(); + } + /** @__sig ippp */ + function napi_is_detached_arraybuffer(env, arraybuffer, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + // @ts-expect-error + var envObject = emnapiCtx.envStore.get(env); + envObject.checkGCAccess(); + if (!envObject.tryCatch.isEmpty()) + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + if (!envObject.canCallIntoJs()) + return envObject.setLastError( + envObject.moduleApiVersion === + 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */ + ? 23 /* napi_status.napi_cannot_run_js */ + : 10 /* napi_status.napi_pending_exception */, + ); + envObject.clearLastError(); + try { + if (!arraybuffer) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + var h = emnapiCtx.handleStore.get(arraybuffer); + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + if (h.isArrayBuffer() && h.value.byteLength === 0) { + try { + // eslint-disable-next-line no-new + new Uint8Array(h.value); + } catch (_) { + HEAP_DATA_VIEW.setInt8(result, 1, true); + return envObject.getReturnStatus(); + } + } + HEAP_DATA_VIEW.setInt8(result, 0, true); + return envObject.getReturnStatus(); + } catch (err) { + envObject.tryCatch.setError(err); + return envObject.setLastError( + 10 /* napi_status.napi_pending_exception */, + ); + } + } + var valueOperationMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_coerce_to_bool: napi_coerce_to_bool, + napi_coerce_to_number: napi_coerce_to_number, + napi_coerce_to_object: napi_coerce_to_object, + napi_coerce_to_string: napi_coerce_to_string, + napi_detach_arraybuffer: napi_detach_arraybuffer, + napi_instanceof: napi_instanceof, + napi_is_array: napi_is_array, + napi_is_arraybuffer: napi_is_arraybuffer, + napi_is_buffer: napi_is_buffer, + napi_is_dataview: napi_is_dataview, + napi_is_date: napi_is_date, + napi_is_detached_arraybuffer: napi_is_detached_arraybuffer, + napi_is_error: napi_is_error, + napi_is_typedarray: napi_is_typedarray, + napi_strict_equals: napi_strict_equals, + napi_typeof: napi_typeof, + }); + /** @__sig ipp */ + function napi_get_version(env, result) { + if (!env) return 1 /* napi_status.napi_invalid_arg */; + var envObject = emnapiCtx.envStore.get(env); + if (!result) + return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var NODE_API_SUPPORTED_VERSION_MAX = 9; /* Version.NODE_API_SUPPORTED_VERSION_MAX */ + var HEAP_DATA_VIEW = new DataView(wasmMemory.buffer); + HEAP_DATA_VIEW.setUint32(result, NODE_API_SUPPORTED_VERSION_MAX, true); + return envObject.clearLastError(); + } + var versionMod = /*#__PURE__*/ Object.freeze({ + __proto__: null, + napi_get_version: napi_get_version, + }); + emnapiAWST.init(); + emnapiExternalMemory.init(); + emnapiString.init(); + emnapiTSFN.init(); + napiModule.emnapi.syncMemory = $emnapiSyncMemory; + napiModule.emnapi.getMemoryAddress = $emnapiGetMemoryAddress; + function addImports(mod) { + var keys = Object.keys(mod); + for (var i = 0; i < keys.length; ++i) { + var k = keys[i]; + if (k.indexOf('$') === 0) continue; + if (k.indexOf('emnapi_') === 0) { + napiModule.imports.emnapi[k] = mod[k]; + } else if ( + k.indexOf('_emnapi_') === 0 || + k === 'napi_set_last_error' || + k === 'napi_clear_last_error' + ) { + napiModule.imports.env[k] = mod[k]; + } else { + napiModule.imports.napi[k] = mod[k]; + } + } + } + addImports(asyncMod); + addImports(memoryMod); + addImports(asyncWorkMod); + addImports(utilMod); + addImports(convert2cMod); + addImports(convert2napiMod); + addImports(createMod); + addImports(globalMod); + addImports(wrapMod); + addImports(envMod); + addImports(emnapiMod); + addImports(errorMod); + addImports(functionMod); + addImports(lifeMod); + addImports(miscellaneousMod); + addImports(nodeMod); + addImports(promiseMod); + addImports(propertyMod); + addImports(scriptMod); + addImports(valueOperationMod); + addImports(versionMod); + napiModule.imports.napi.napi_create_threadsafe_function = + napi_create_threadsafe_function; + napiModule.imports.napi.napi_get_threadsafe_function_context = + napi_get_threadsafe_function_context; + napiModule.imports.napi.napi_call_threadsafe_function = + napi_call_threadsafe_function; + napiModule.imports.napi.napi_acquire_threadsafe_function = + napi_acquire_threadsafe_function; + napiModule.imports.napi.napi_release_threadsafe_function = + napi_release_threadsafe_function; + napiModule.imports.napi.napi_unref_threadsafe_function = + napi_unref_threadsafe_function; + napiModule.imports.napi.napi_ref_threadsafe_function = + napi_ref_threadsafe_function; return napiModule; + })(); + return napiModule; } function loadNapiModuleImpl(loadFn, userNapiModule, wasmInput, options) { - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - options = options !== null && options !== void 0 ? options : {}; - var getMemory = options.getMemory; - var getTable = options.getTable; - var beforeInit = options.beforeInit; - if (getMemory != null && typeof getMemory !== 'function') { - throw new TypeError('options.getMemory is not a function'); + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + options = options !== null && options !== void 0 ? options : {}; + var getMemory = options.getMemory; + var getTable = options.getTable; + var beforeInit = options.beforeInit; + if (getMemory != null && typeof getMemory !== 'function') { + throw new TypeError('options.getMemory is not a function'); + } + if (getTable != null && typeof getTable !== 'function') { + throw new TypeError('options.getTable is not a function'); + } + if (beforeInit != null && typeof beforeInit !== 'function') { + throw new TypeError('options.beforeInit is not a function'); + } + var napiModule; + { + napiModule = createNapiModule(options); + } + var wasi = options.wasi; + var importObject = { + env: napiModule.imports.env, + napi: napiModule.imports.napi, + emnapi: napiModule.imports.emnapi, + wasi: { + // eslint-disable-next-line camelcase + 'thread-spawn': function __imported_wasi_thread_spawn( + startArg, + errorOrTid, + ) { + return napiModule.spawnThread(startArg, errorOrTid); + }, + }, + }; + if (wasi) { + Object.assign( + importObject, + typeof wasi.getImportObject === 'function' + ? wasi.getImportObject() + : { wasi_snapshot_preview1: wasi.wasiImport }, + ); + } + var overwriteImports = options.overwriteImports; + if (typeof overwriteImports === 'function') { + var newImportObject = overwriteImports(importObject); + if (typeof newImportObject === 'object' && newImportObject !== null) { + importObject = newImportObject; } - if (getTable != null && typeof getTable !== 'function') { - throw new TypeError('options.getTable is not a function'); + } + return loadFn(wasmInput, importObject, function (err, source) { + if (err) { + throw err; } - if (beforeInit != null && typeof beforeInit !== 'function') { - throw new TypeError('options.beforeInit is not a function'); + var originalInstance = source.instance; + var instance = originalInstance; + var originalExports = originalInstance.exports; + var exportMemory = 'memory' in originalExports; + var importMemory = 'memory' in importObject.env; + var memory = getMemory + ? getMemory(originalExports) + : exportMemory + ? originalExports.memory + : importMemory + ? importObject.env.memory + : undefined; + if (!memory) { + throw new Error('memory is neither exported nor imported'); } - var napiModule; - { - napiModule = createNapiModule(options); - } - var wasi = options.wasi; - var importObject = { - env: napiModule.imports.env, - napi: napiModule.imports.napi, - emnapi: napiModule.imports.emnapi, - wasi: { - // eslint-disable-next-line camelcase - 'thread-spawn': function __imported_wasi_thread_spawn(startArg, errorOrTid) { - return napiModule.spawnThread(startArg, errorOrTid); - } - } - }; + var table = getTable + ? getTable(originalExports) + : originalExports.__indirect_function_table; + if (wasi && !exportMemory) { + var exports_1 = Object.create(null); + Object.assign(exports_1, originalExports, { memory: memory }); + instance = { exports: exports_1 }; + } + var module = source.module; if (wasi) { - Object.assign(importObject, typeof wasi.getImportObject === 'function' - ? wasi.getImportObject() - : { wasi_snapshot_preview1: wasi.wasiImport }); + if (napiModule.childThread) { + // https://github.com/nodejs/help/issues/4102 + var createHandler = function (target) { + var handlers = [ + 'apply', + 'construct', + 'defineProperty', + 'deleteProperty', + 'get', + 'getOwnPropertyDescriptor', + 'getPrototypeOf', + 'has', + 'isExtensible', + 'ownKeys', + 'preventExtensions', + 'set', + 'setPrototypeOf', + ]; + var handler = {}; + var _loop_1 = function (i) { + var name_1 = handlers[i]; + handler[name_1] = function () { + var args = Array.prototype.slice.call(arguments, 1); + args.unshift(target); + return Reflect[name_1].apply(Reflect, args); + }; + }; + for (var i = 0; i < handlers.length; i++) { + _loop_1(i); + } + return handler; + }; + var handler = createHandler(originalExports); + var noop_1 = function () {}; + handler.get = function (_target, p, receiver) { + if (p === 'memory') { + return memory; + } + if (p === '_initialize') { + return noop_1; + } + return Reflect.get(originalExports, p, receiver); + }; + var exportsProxy_1 = new Proxy(Object.create(null), handler); + instance = new Proxy(instance, { + get: function (target, p, receiver) { + if (p === 'exports') { + return exportsProxy_1; + } + return Reflect.get(target, p, receiver); + }, + }); + } + wasi.initialize(instance); } - var overwriteImports = options.overwriteImports; - if (typeof overwriteImports === 'function') { - var newImportObject = overwriteImports(importObject); - if (typeof newImportObject === 'object' && newImportObject !== null) { - importObject = newImportObject; - } + if (beforeInit) { + beforeInit({ + instance: originalInstance, + module: module, + }); } - return loadFn(wasmInput, importObject, function (err, source) { - if (err) { - throw err; - } - var originalInstance = source.instance; - var instance = originalInstance; - var originalExports = originalInstance.exports; - var exportMemory = 'memory' in originalExports; - var importMemory = 'memory' in importObject.env; - var memory = getMemory - ? getMemory(originalExports) - : exportMemory - ? originalExports.memory - : importMemory - ? importObject.env.memory - : undefined; - if (!memory) { - throw new Error('memory is neither exported nor imported'); - } - var table = getTable ? getTable(originalExports) : originalExports.__indirect_function_table; - if (wasi && !exportMemory) { - var exports_1 = Object.create(null); - Object.assign(exports_1, originalExports, { memory: memory }); - instance = { exports: exports_1 }; - } - var module = source.module; - if (wasi) { - if (napiModule.childThread) { - // https://github.com/nodejs/help/issues/4102 - var createHandler = function (target) { - var handlers = [ - 'apply', - 'construct', - 'defineProperty', - 'deleteProperty', - 'get', - 'getOwnPropertyDescriptor', - 'getPrototypeOf', - 'has', - 'isExtensible', - 'ownKeys', - 'preventExtensions', - 'set', - 'setPrototypeOf' - ]; - var handler = {}; - var _loop_1 = function (i) { - var name_1 = handlers[i]; - handler[name_1] = function () { - var args = Array.prototype.slice.call(arguments, 1); - args.unshift(target); - return Reflect[name_1].apply(Reflect, args); - }; - }; - for (var i = 0; i < handlers.length; i++) { - _loop_1(i); - } - return handler; - }; - var handler = createHandler(originalExports); - var noop_1 = function () { }; - handler.get = function (_target, p, receiver) { - if (p === 'memory') { - return memory; - } - if (p === '_initialize') { - return noop_1; - } - return Reflect.get(originalExports, p, receiver); - }; - var exportsProxy_1 = new Proxy(Object.create(null), handler); - instance = new Proxy(instance, { - get: function (target, p, receiver) { - if (p === 'exports') { - return exportsProxy_1; - } - return Reflect.get(target, p, receiver); - } - }); - } - wasi.initialize(instance); - } - if (beforeInit) { - beforeInit({ - instance: originalInstance, - module: module - }); - } - napiModule.init({ - instance: instance, - module: module, - memory: memory, - table: table - }); - var ret = { instance: originalInstance, module: module }; - { - ret.napiModule = napiModule; - } - return ret; + napiModule.init({ + instance: instance, + module: module, + memory: memory, + table: table, }); + var ret = { instance: originalInstance, module: module }; + { + ret.napiModule = napiModule; + } + return ret; + }); } function loadCallback(wasmInput, importObject, callback) { - return load(wasmInput, importObject).then(function (source) { - return callback(null, source); - }, function (err) { - return callback(err); - }); + return load(wasmInput, importObject).then( + function (source) { + return callback(null, source); + }, + function (err) { + return callback(err); + }, + ); } function loadSyncCallback(wasmInput, importObject, callback) { - var source; - try { - source = loadSync(wasmInput, importObject); - } - catch (err) { - return callback(err); - } - return callback(null, source); + var source; + try { + source = loadSync(wasmInput, importObject); + } catch (err) { + return callback(err); + } + return callback(null, source); } /** @public */ function instantiateNapiModule( - /** Only support `BufferSource` or `WebAssembly.Module` on Node.js */ - wasmInput, options) { - return loadNapiModuleImpl(loadCallback, undefined, wasmInput, options); + /** Only support `BufferSource` or `WebAssembly.Module` on Node.js */ + wasmInput, + options, +) { + return loadNapiModuleImpl(loadCallback, undefined, wasmInput, options); } /** @public */ function instantiateNapiModuleSync(wasmInput, options) { - return loadNapiModuleImpl(loadSyncCallback, undefined, wasmInput, options); + return loadNapiModuleImpl(loadSyncCallback, undefined, wasmInput, options); } /** @public */ var MessageHandler = /*#__PURE__*/ (function () { - function MessageHandler(options) { - var onLoad = options.onLoad; - if (typeof onLoad !== 'function') { - throw new TypeError('options.onLoad is not a function'); - } - this.onLoad = onLoad; - this.instance = undefined; - // this.module = undefined - this.napiModule = undefined; - this.messagesBeforeLoad = []; - } - MessageHandler.prototype.handle = function (e) { - var _this = this; - var _a; - if ((_a = e === null || e === void 0 ? void 0 : e.data) === null || _a === void 0 ? void 0 : _a.__emnapi__) { - var type = e.data.__emnapi__.type; - var payload_1 = e.data.__emnapi__.payload; - var onLoad = this.onLoad; - if (type === 'load') { - if (this.instance !== undefined) - return; - var source = onLoad(payload_1); - var then = source && 'then' in source ? source.then : undefined; - if (typeof then === 'function') { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - then.call(source, function (source) { onLoaded.call(_this, source); }, function (err) { throw err; }); - } - else { - onLoaded.call(this, source); - } - } - else if (type === 'start') { - handleAfterLoad.call(this, e, function () { - _this.napiModule.startThread(payload_1.tid, payload_1.arg); - }); - } - else if (type === 'async-worker-init') { - handleAfterLoad.call(this, e, function () { - _this.napiModule.initWorker(payload_1.arg); - }); - } - else if (type === 'async-work-execute') { - handleAfterLoad.call(this, e, function () { - _this.napiModule.executeAsyncWork(payload_1.work); - }); - } - } - }; - return MessageHandler; -}()); -function handleAfterLoad(e, f) { - if (this.instance !== undefined) { - f.call(this, e); + function MessageHandler(options) { + var onLoad = options.onLoad; + if (typeof onLoad !== 'function') { + throw new TypeError('options.onLoad is not a function'); } - else { - this.messagesBeforeLoad.push(e.data); + this.onLoad = onLoad; + this.instance = undefined; + // this.module = undefined + this.napiModule = undefined; + this.messagesBeforeLoad = []; + } + MessageHandler.prototype.handle = function (e) { + var _this = this; + var _a; + if ( + (_a = e === null || e === void 0 ? void 0 : e.data) === null || + _a === void 0 + ? void 0 + : _a.__emnapi__ + ) { + var type = e.data.__emnapi__.type; + var payload_1 = e.data.__emnapi__.payload; + var onLoad = this.onLoad; + if (type === 'load') { + if (this.instance !== undefined) return; + var source = onLoad(payload_1); + var then = source && 'then' in source ? source.then : undefined; + if (typeof then === 'function') { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + then.call( + source, + function (source) { + onLoaded.call(_this, source); + }, + function (err) { + throw err; + }, + ); + } else { + onLoaded.call(this, source); + } + } else if (type === 'start') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.startThread(payload_1.tid, payload_1.arg); + }); + } else if (type === 'async-worker-init') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.initWorker(payload_1.arg); + }); + } else if (type === 'async-work-execute') { + handleAfterLoad.call(this, e, function () { + _this.napiModule.executeAsyncWork(payload_1.work); + }); + } } + }; + return MessageHandler; +})(); +function handleAfterLoad(e, f) { + if (this.instance !== undefined) { + f.call(this, e); + } else { + this.messagesBeforeLoad.push(e.data); + } } function onLoaded(source) { - if (source == null) { - throw new TypeError('onLoad should return an object'); - } - var instance = source.instance; - var napiModule = source.napiModule; - if (!instance) - throw new TypeError('onLoad should return an object which includes "instance"'); - if (!napiModule) - throw new TypeError('onLoad should return an object which includes "napiModule"'); - if (!napiModule.childThread) - throw new Error('napiModule should be created with `childThread: true`'); - this.instance = instance; - this.napiModule = napiModule; - var postMessage = napiModule.postMessage; - postMessage({ - __emnapi__: { - type: 'loaded', - payload: {} - } - }); - var messages = this.messagesBeforeLoad; - this.messagesBeforeLoad = []; - for (var i = 0; i < messages.length; i++) { - var data = messages[i]; - this.handle({ data: data }); - } + if (source == null) { + throw new TypeError('onLoad should return an object'); + } + var instance = source.instance; + var napiModule = source.napiModule; + if (!instance) + throw new TypeError( + 'onLoad should return an object which includes "instance"', + ); + if (!napiModule) + throw new TypeError( + 'onLoad should return an object which includes "napiModule"', + ); + if (!napiModule.childThread) + throw new Error('napiModule should be created with `childThread: true`'); + this.instance = instance; + this.napiModule = napiModule; + var postMessage = napiModule.postMessage; + postMessage({ + __emnapi__: { + type: 'loaded', + payload: {}, + }, + }); + var messages = this.messagesBeforeLoad; + this.messagesBeforeLoad = []; + for (var i = 0; i < messages.length; i++) { + var data = messages[i]; + this.handle({ data: data }); + } } /****************************************************************************** @@ -7551,3810 +9025,5082 @@ PERFORMANCE OF THIS SOFTWARE. /* global Reflect, Promise, SuppressedError, Symbol */ var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); + extendStatics = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (d, b) { + d.__proto__ = b; + }) || + function (d, b) { + for (var p in b) + if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); }; function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + if (typeof b !== 'function' && b !== null) + throw new TypeError( + 'Class extends value ' + String(b) + ' is not a constructor or null', + ); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = + b === null ? Object.create(b) : ((__.prototype = b.prototype), new __()); } -typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; -}; +typeof SuppressedError === 'function' + ? SuppressedError + : function (error, suppressed, message) { + var e = new Error(message); + return ( + (e.name = 'SuppressedError'), + (e.error = error), + (e.suppressed = suppressed), + e + ); + }; var EMPTY_ARGS = []; var CallbackInfo = /*#__PURE__*/ (function () { - function CallbackInfo(id, parent, child, thiz, data, args, fn) { - this.id = id; - this.parent = parent; - this.child = child; - this.thiz = thiz; - this.data = data; - this.args = args; - this.fn = fn; - } - CallbackInfo.prototype.getNewTarget = function (envObject) { - var thiz = this.thiz; - // eslint-disable-next-line @typescript-eslint/prefer-optional-chain - if (thiz == null || thiz.constructor == null) - return 0; - return thiz instanceof this.fn ? envObject.ensureHandleId(thiz.constructor) : 0; - }; - CallbackInfo.prototype.dispose = function () { - if (this.thiz !== undefined) - this.thiz = undefined; - this.args = EMPTY_ARGS; - this.fn = null; - }; - return CallbackInfo; -}()); + function CallbackInfo(id, parent, child, thiz, data, args, fn) { + this.id = id; + this.parent = parent; + this.child = child; + this.thiz = thiz; + this.data = data; + this.args = args; + this.fn = fn; + } + CallbackInfo.prototype.getNewTarget = function (envObject) { + var thiz = this.thiz; + // eslint-disable-next-line @typescript-eslint/prefer-optional-chain + if (thiz == null || thiz.constructor == null) return 0; + return thiz instanceof this.fn + ? envObject.ensureHandleId(thiz.constructor) + : 0; + }; + CallbackInfo.prototype.dispose = function () { + if (this.thiz !== undefined) this.thiz = undefined; + this.args = EMPTY_ARGS; + this.fn = null; + }; + return CallbackInfo; +})(); var ROOT_CBINFO = new CallbackInfo(0, null, null, null, 0, null, null); var CallbackInfoStack = /*#__PURE__*/ (function () { - function CallbackInfoStack() { - this.current = ROOT_CBINFO; - } - CallbackInfoStack.prototype.get = function (id) { - if (id === 1) - return ROOT_CBINFO.child; - var info = ROOT_CBINFO; - for (var i = 0; i < id; ++i) { - info = info.child; - if (info === null) - return null; - } - return info === ROOT_CBINFO ? null : info; - }; - CallbackInfoStack.prototype.pop = function () { - var current = this.current; - if (current === ROOT_CBINFO) - return; - this.current = current.parent; - current.dispose(); - }; - CallbackInfoStack.prototype.push = function (thiz, data, args, fn) { - var info = this.current.child; - if (info) { - info.thiz = thiz; - info.data = data; - info.args = args; - info.fn = fn; - } - else { - info = new CallbackInfo(this.current.id + 1, this.current, null, thiz, data, args, fn); - this.current.child = info; - } - this.current = info; - return info.id; - }; - CallbackInfoStack.prototype.dispose = function () { - this.current = null; - }; - return CallbackInfoStack; -}()); - -var supportNewFunction = /*#__PURE__*/ (function () { - var f; - try { - f = new Function(); + function CallbackInfoStack() { + this.current = ROOT_CBINFO; + } + CallbackInfoStack.prototype.get = function (id) { + if (id === 1) return ROOT_CBINFO.child; + var info = ROOT_CBINFO; + for (var i = 0; i < id; ++i) { + info = info.child; + if (info === null) return null; } - catch (_) { - return false; + return info === ROOT_CBINFO ? null : info; + }; + CallbackInfoStack.prototype.pop = function () { + var current = this.current; + if (current === ROOT_CBINFO) return; + this.current = current.parent; + current.dispose(); + }; + CallbackInfoStack.prototype.push = function (thiz, data, args, fn) { + var info = this.current.child; + if (info) { + info.thiz = thiz; + info.data = data; + info.args = args; + info.fn = fn; + } else { + info = new CallbackInfo( + this.current.id + 1, + this.current, + null, + thiz, + data, + args, + fn, + ); + this.current.child = info; } - return typeof f === 'function'; + this.current = info; + return info.id; + }; + CallbackInfoStack.prototype.dispose = function () { + this.current = null; + }; + return CallbackInfoStack; +})(); + +var supportNewFunction = /*#__PURE__*/ (function () { + var f; + try { + f = new Function(); + } catch (_) { + return false; + } + return typeof f === 'function'; })(); var _global = /*#__PURE__*/ (function () { - if (typeof globalThis !== 'undefined') - return globalThis; - var g = (function () { return this; })(); - if (!g && supportNewFunction) { - try { - g = new Function('return this')(); - } - catch (_) { } - } - if (!g) { - { - if (typeof global !== 'undefined') - return global; - } - if (typeof window !== 'undefined') - return window; - if (typeof self !== 'undefined') - return self; + if (typeof globalThis !== 'undefined') return globalThis; + var g = (function () { + return this; + })(); + if (!g && supportNewFunction) { + try { + g = new Function('return this')(); + } catch (_) {} + } + if (!g) { + { + if (typeof global !== 'undefined') return global; } - return g; + if (typeof window !== 'undefined') return window; + if (typeof self !== 'undefined') return self; + } + return g; })(); var TryCatch = /*#__PURE__*/ (function () { - function TryCatch() { - this._exception = undefined; - this._caught = false; - } - TryCatch.prototype.isEmpty = function () { - return !this._caught; - }; - TryCatch.prototype.hasCaught = function () { - return this._caught; - }; - TryCatch.prototype.exception = function () { - return this._exception; - }; - TryCatch.prototype.setError = function (err) { - this._caught = true; - this._exception = err; - }; - TryCatch.prototype.reset = function () { - this._caught = false; - this._exception = undefined; - }; - TryCatch.prototype.extractException = function () { - var e = this._exception; - this.reset(); - return e; - }; - return TryCatch; -}()); + function TryCatch() { + this._exception = undefined; + this._caught = false; + } + TryCatch.prototype.isEmpty = function () { + return !this._caught; + }; + TryCatch.prototype.hasCaught = function () { + return this._caught; + }; + TryCatch.prototype.exception = function () { + return this._exception; + }; + TryCatch.prototype.setError = function (err) { + this._caught = true; + this._exception = err; + }; + TryCatch.prototype.reset = function () { + this._caught = false; + this._exception = undefined; + }; + TryCatch.prototype.extractException = function () { + var e = this._exception; + this.reset(); + return e; + }; + return TryCatch; +})(); var canSetFunctionName = /*#__PURE__*/ (function () { - var _a; - try { - return Boolean((_a = Object.getOwnPropertyDescriptor(Function.prototype, 'name')) === null || _a === void 0 ? void 0 : _a.configurable); - } - catch (_) { - return false; - } + var _a; + try { + return Boolean( + (_a = Object.getOwnPropertyDescriptor(Function.prototype, 'name')) === + null || _a === void 0 + ? void 0 + : _a.configurable, + ); + } catch (_) { + return false; + } })(); var supportReflect = typeof Reflect === 'object'; -var supportFinalizer = (typeof FinalizationRegistry !== 'undefined') && (typeof WeakRef !== 'undefined'); +var supportFinalizer = + typeof FinalizationRegistry !== 'undefined' && typeof WeakRef !== 'undefined'; var supportWeakSymbol = /*#__PURE__*/ (function () { - try { - // eslint-disable-next-line symbol-description - var sym = Symbol(); - // eslint-disable-next-line no-new - new WeakRef(sym); - new WeakMap().set(sym, undefined); - } - catch (_) { - return false; - } - return true; + try { + // eslint-disable-next-line symbol-description + var sym = Symbol(); + // eslint-disable-next-line no-new + new WeakRef(sym); + new WeakMap().set(sym, undefined); + } catch (_) { + return false; + } + return true; })(); var supportBigInt = typeof BigInt !== 'undefined'; function isReferenceType(v) { - return (typeof v === 'object' && v !== null) || typeof v === 'function'; + return (typeof v === 'object' && v !== null) || typeof v === 'function'; } var _require = /*#__PURE__*/ (function () { - var nativeRequire; - { - nativeRequire = (function () { - return (typeof require !== 'undefined' ? require : undefined); - })(); - } - return nativeRequire; + var nativeRequire; + { + nativeRequire = (function () { + return typeof require !== 'undefined' ? require : undefined; + })(); + } + return nativeRequire; })(); -var _MessageChannel = typeof MessageChannel === 'function' +var _MessageChannel = + typeof MessageChannel === 'function' ? MessageChannel : /*#__PURE__*/ (function () { try { - return _require('worker_threads').MessageChannel; - } - catch (_) { } + return _require('worker_threads').MessageChannel; + } catch (_) {} return undefined; - })(); -var _setImmediate = typeof setImmediate === 'function' + })(); +var _setImmediate = + typeof setImmediate === 'function' ? setImmediate : function (callback) { if (typeof callback !== 'function') { - throw new TypeError('The "callback" argument must be of type function'); + throw new TypeError( + 'The "callback" argument must be of type function', + ); } if (_MessageChannel) { - var channel_1 = new _MessageChannel(); - channel_1.port1.onmessage = function () { - channel_1.port1.onmessage = null; - channel_1 = undefined; - callback(); - }; - channel_1.port2.postMessage(null); - } - else { - setTimeout(callback, 0); - } - }; -var _Buffer = typeof Buffer === 'function' + var channel_1 = new _MessageChannel(); + channel_1.port1.onmessage = function () { + channel_1.port1.onmessage = null; + channel_1 = undefined; + callback(); + }; + channel_1.port2.postMessage(null); + } else { + setTimeout(callback, 0); + } + }; +var _Buffer = + typeof Buffer === 'function' ? Buffer : /*#__PURE__*/ (function () { try { - return _require('buffer').Buffer; - } - catch (_) { } + return _require('buffer').Buffer; + } catch (_) {} return undefined; - })(); -var version = "1.1.1"; -var NODE_API_SUPPORTED_VERSION_MAX = 9 /* Version.NODE_API_SUPPORTED_VERSION_MAX */; -var NAPI_VERSION_EXPERIMENTAL = 2147483647 /* Version.NAPI_VERSION_EXPERIMENTAL */; -var NODE_API_DEFAULT_MODULE_API_VERSION = 8 /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */; + })(); +var version = '1.1.1'; +var NODE_API_SUPPORTED_VERSION_MAX = 9; /* Version.NODE_API_SUPPORTED_VERSION_MAX */ +var NAPI_VERSION_EXPERIMENTAL = 2147483647; /* Version.NAPI_VERSION_EXPERIMENTAL */ +var NODE_API_DEFAULT_MODULE_API_VERSION = 8; /* Version.NODE_API_DEFAULT_MODULE_API_VERSION */ var Handle = /*#__PURE__*/ (function () { - function Handle(id, value) { - this.id = id; - this.value = value; - } - Handle.prototype.data = function (envObject) { - return envObject.getObjectBinding(this.value).data; - }; - Handle.prototype.isNumber = function () { - return typeof this.value === 'number'; - }; - Handle.prototype.isBigInt = function () { - return typeof this.value === 'bigint'; - }; - Handle.prototype.isString = function () { - return typeof this.value === 'string'; - }; - Handle.prototype.isFunction = function () { - return typeof this.value === 'function'; - }; - Handle.prototype.isExternal = function () { - return (isReferenceType(this.value) && Object.getPrototypeOf(this.value) === null); - }; - Handle.prototype.isObject = function () { - return typeof this.value === 'object' && this.value !== null; - }; - Handle.prototype.isArray = function () { - return Array.isArray(this.value); - }; - Handle.prototype.isArrayBuffer = function () { - return (this.value instanceof ArrayBuffer); - }; - Handle.prototype.isTypedArray = function () { - return (ArrayBuffer.isView(this.value)) && !(this.value instanceof DataView); - }; - Handle.prototype.isBuffer = function () { - return typeof _Buffer === 'function' && _Buffer.isBuffer(this.value); - }; - Handle.prototype.isDataView = function () { - return (this.value instanceof DataView); - }; - Handle.prototype.isDate = function () { - return (this.value instanceof Date); - }; - Handle.prototype.isPromise = function () { - return (this.value instanceof Promise); - }; - Handle.prototype.isBoolean = function () { - return typeof this.value === 'boolean'; - }; - Handle.prototype.isUndefined = function () { - return this.value === undefined; - }; - Handle.prototype.isSymbol = function () { - return typeof this.value === 'symbol'; - }; - Handle.prototype.isNull = function () { - return this.value === null; - }; - Handle.prototype.dispose = function () { - this.value = undefined; - }; - return Handle; -}()); + function Handle(id, value) { + this.id = id; + this.value = value; + } + Handle.prototype.data = function (envObject) { + return envObject.getObjectBinding(this.value).data; + }; + Handle.prototype.isNumber = function () { + return typeof this.value === 'number'; + }; + Handle.prototype.isBigInt = function () { + return typeof this.value === 'bigint'; + }; + Handle.prototype.isString = function () { + return typeof this.value === 'string'; + }; + Handle.prototype.isFunction = function () { + return typeof this.value === 'function'; + }; + Handle.prototype.isExternal = function () { + return ( + isReferenceType(this.value) && Object.getPrototypeOf(this.value) === null + ); + }; + Handle.prototype.isObject = function () { + return typeof this.value === 'object' && this.value !== null; + }; + Handle.prototype.isArray = function () { + return Array.isArray(this.value); + }; + Handle.prototype.isArrayBuffer = function () { + return this.value instanceof ArrayBuffer; + }; + Handle.prototype.isTypedArray = function () { + return ArrayBuffer.isView(this.value) && !(this.value instanceof DataView); + }; + Handle.prototype.isBuffer = function () { + return typeof _Buffer === 'function' && _Buffer.isBuffer(this.value); + }; + Handle.prototype.isDataView = function () { + return this.value instanceof DataView; + }; + Handle.prototype.isDate = function () { + return this.value instanceof Date; + }; + Handle.prototype.isPromise = function () { + return this.value instanceof Promise; + }; + Handle.prototype.isBoolean = function () { + return typeof this.value === 'boolean'; + }; + Handle.prototype.isUndefined = function () { + return this.value === undefined; + }; + Handle.prototype.isSymbol = function () { + return typeof this.value === 'symbol'; + }; + Handle.prototype.isNull = function () { + return this.value === null; + }; + Handle.prototype.dispose = function () { + this.value = undefined; + }; + return Handle; +})(); var ConstHandle = /*#__PURE__*/ (function (_super) { - __extends(ConstHandle, _super); - function ConstHandle(id, value) { - return _super.call(this, id, value) || this; - } - ConstHandle.prototype.dispose = function () { }; - return ConstHandle; -}(Handle)); + __extends(ConstHandle, _super); + function ConstHandle(id, value) { + return _super.call(this, id, value) || this; + } + ConstHandle.prototype.dispose = function () {}; + return ConstHandle; +})(Handle); function External() { - Object.setPrototypeOf(this, null); + Object.setPrototypeOf(this, null); } External.prototype = null; var HandleStore = /*#__PURE__*/ (function () { - function HandleStore() { - this._values = [ - undefined, - HandleStore.UNDEFINED, - HandleStore.NULL, - HandleStore.FALSE, - HandleStore.TRUE, - HandleStore.GLOBAL - ]; - this._next = HandleStore.MIN_ID; - } - HandleStore.prototype.push = function (value) { - var h; - var next = this._next; - var values = this._values; - if (next < values.length) { - h = values[next]; - h.value = value; - } - else { - h = new Handle(next, value); - values[next] = h; - } - this._next++; - return h; - }; - HandleStore.prototype.erase = function (start, end) { - this._next = start; - var values = this._values; - for (var i = start; i < end; ++i) { - values[i].dispose(); - } - }; - HandleStore.prototype.get = function (id) { - return this._values[id]; - }; - HandleStore.prototype.swap = function (a, b) { - var values = this._values; - var h = values[a]; - values[a] = values[b]; - values[a].id = Number(a); - values[b] = h; - h.id = Number(b); - }; - HandleStore.prototype.dispose = function () { - this._values.length = HandleStore.MIN_ID; - this._next = HandleStore.MIN_ID; - }; - HandleStore.UNDEFINED = new ConstHandle(1 /* GlobalHandle.UNDEFINED */, undefined); - HandleStore.NULL = new ConstHandle(2 /* GlobalHandle.NULL */, null); - HandleStore.FALSE = new ConstHandle(3 /* GlobalHandle.FALSE */, false); - HandleStore.TRUE = new ConstHandle(4 /* GlobalHandle.TRUE */, true); - HandleStore.GLOBAL = new ConstHandle(5 /* GlobalHandle.GLOBAL */, _global); - HandleStore.MIN_ID = 6; - return HandleStore; -}()); + function HandleStore() { + this._values = [ + undefined, + HandleStore.UNDEFINED, + HandleStore.NULL, + HandleStore.FALSE, + HandleStore.TRUE, + HandleStore.GLOBAL, + ]; + this._next = HandleStore.MIN_ID; + } + HandleStore.prototype.push = function (value) { + var h; + var next = this._next; + var values = this._values; + if (next < values.length) { + h = values[next]; + h.value = value; + } else { + h = new Handle(next, value); + values[next] = h; + } + this._next++; + return h; + }; + HandleStore.prototype.erase = function (start, end) { + this._next = start; + var values = this._values; + for (var i = start; i < end; ++i) { + values[i].dispose(); + } + }; + HandleStore.prototype.get = function (id) { + return this._values[id]; + }; + HandleStore.prototype.swap = function (a, b) { + var values = this._values; + var h = values[a]; + values[a] = values[b]; + values[a].id = Number(a); + values[b] = h; + h.id = Number(b); + }; + HandleStore.prototype.dispose = function () { + this._values.length = HandleStore.MIN_ID; + this._next = HandleStore.MIN_ID; + }; + HandleStore.UNDEFINED = new ConstHandle( + 1 /* GlobalHandle.UNDEFINED */, + undefined, + ); + HandleStore.NULL = new ConstHandle(2 /* GlobalHandle.NULL */, null); + HandleStore.FALSE = new ConstHandle(3 /* GlobalHandle.FALSE */, false); + HandleStore.TRUE = new ConstHandle(4 /* GlobalHandle.TRUE */, true); + HandleStore.GLOBAL = new ConstHandle(5 /* GlobalHandle.GLOBAL */, _global); + HandleStore.MIN_ID = 6; + return HandleStore; +})(); var HandleScope = /*#__PURE__*/ (function () { - function HandleScope(handleStore, id, parentScope, start, end) { - if (end === void 0) { end = start; } - this.handleStore = handleStore; - this.id = id; - this.parent = parentScope; - this.child = null; - if (parentScope !== null) - parentScope.child = this; - this.start = start; - this.end = end; - this._escapeCalled = false; - } - HandleScope.prototype.add = function (value) { - var h = this.handleStore.push(value); - this.end++; - return h; - }; - HandleScope.prototype.addExternal = function (envObject, data) { - var value = new External(); - var h = envObject.ctx.handleStore.push(value); - var binding = envObject.initObjectBinding(value); - binding.data = data; - this.end++; - return h; - }; - HandleScope.prototype.dispose = function () { - if (this.start === this.end) - return; - this.handleStore.erase(this.start, this.end); - }; - HandleScope.prototype.escape = function (handle) { - if (this._escapeCalled) - return null; - this._escapeCalled = true; - if (handle < this.start || handle >= this.end) { - return null; - } - this.handleStore.swap(handle, this.start); - var h = this.handleStore.get(this.start); - this.start++; - this.parent.end++; - return h; - }; - HandleScope.prototype.escapeCalled = function () { - return this._escapeCalled; - }; - return HandleScope; -}()); + function HandleScope(handleStore, id, parentScope, start, end) { + if (end === void 0) { + end = start; + } + this.handleStore = handleStore; + this.id = id; + this.parent = parentScope; + this.child = null; + if (parentScope !== null) parentScope.child = this; + this.start = start; + this.end = end; + this._escapeCalled = false; + } + HandleScope.prototype.add = function (value) { + var h = this.handleStore.push(value); + this.end++; + return h; + }; + HandleScope.prototype.addExternal = function (envObject, data) { + var value = new External(); + var h = envObject.ctx.handleStore.push(value); + var binding = envObject.initObjectBinding(value); + binding.data = data; + this.end++; + return h; + }; + HandleScope.prototype.dispose = function () { + if (this.start === this.end) return; + this.handleStore.erase(this.start, this.end); + }; + HandleScope.prototype.escape = function (handle) { + if (this._escapeCalled) return null; + this._escapeCalled = true; + if (handle < this.start || handle >= this.end) { + return null; + } + this.handleStore.swap(handle, this.start); + var h = this.handleStore.get(this.start); + this.start++; + this.parent.end++; + return h; + }; + HandleScope.prototype.escapeCalled = function () { + return this._escapeCalled; + }; + return HandleScope; +})(); var ScopeStore = /*#__PURE__*/ (function () { - function ScopeStore() { - this._rootScope = new HandleScope(null, 0, null, 1, HandleStore.MIN_ID); - this.currentScope = this._rootScope; - } - ScopeStore.prototype.get = function (id) { - id = Number(id); - var scope = this.currentScope; - while (scope !== this._rootScope) { - if (scope.id === id) { - return scope; - } - scope = scope.parent; - } - return undefined; - }; - ScopeStore.prototype.openScope = function (envObject) { - var currentScope = this.currentScope; - var scope = currentScope.child; - if (scope !== null) { - scope.start = scope.end = currentScope.end; - scope._escapeCalled = false; - } - else { - scope = new HandleScope(envObject.ctx.handleStore, currentScope.id + 1, currentScope, currentScope.end); - } - this.currentScope = scope; - envObject.openHandleScopes++; + function ScopeStore() { + this._rootScope = new HandleScope(null, 0, null, 1, HandleStore.MIN_ID); + this.currentScope = this._rootScope; + } + ScopeStore.prototype.get = function (id) { + id = Number(id); + var scope = this.currentScope; + while (scope !== this._rootScope) { + if (scope.id === id) { return scope; - }; - ScopeStore.prototype.closeScope = function (envObject) { - if (envObject.openHandleScopes === 0) - return; - var scope = this.currentScope; - this.currentScope = scope.parent; - scope.dispose(); - envObject.openHandleScopes--; - }; - ScopeStore.prototype.dispose = function () { - var scope = this.currentScope; - while (scope !== null) { - scope.handleStore = null; - scope.id = 0; - scope.parent = null; - scope.start = HandleStore.MIN_ID; - scope.end = HandleStore.MIN_ID; - scope._escapeCalled = false; - var child = scope.child; - scope.child = null; - scope = child; - } - this.currentScope = null; - }; - return ScopeStore; -}()); - -var RefTracker = /*#__PURE__*/ (function () { - function RefTracker() { - this._next = null; - this._prev = null; - } - /** @virtual */ - RefTracker.prototype.finalize = function () { }; - RefTracker.prototype.link = function (list) { - this._prev = list; - this._next = list._next; - if (this._next !== null) { - this._next._prev = this; - } - list._next = this; - }; - RefTracker.prototype.unlink = function () { - if (this._prev !== null) { - this._prev._next = this._next; - } - if (this._next !== null) { - this._next._prev = this._prev; - } - this._prev = null; - this._next = null; - }; - RefTracker.finalizeAll = function (list) { - while (list._next !== null) { - list._next.finalize(); - } - }; - return RefTracker; -}()); + } + scope = scope.parent; + } + return undefined; + }; + ScopeStore.prototype.openScope = function (envObject) { + var currentScope = this.currentScope; + var scope = currentScope.child; + if (scope !== null) { + scope.start = scope.end = currentScope.end; + scope._escapeCalled = false; + } else { + scope = new HandleScope( + envObject.ctx.handleStore, + currentScope.id + 1, + currentScope, + currentScope.end, + ); + } + this.currentScope = scope; + envObject.openHandleScopes++; + return scope; + }; + ScopeStore.prototype.closeScope = function (envObject) { + if (envObject.openHandleScopes === 0) return; + var scope = this.currentScope; + this.currentScope = scope.parent; + scope.dispose(); + envObject.openHandleScopes--; + }; + ScopeStore.prototype.dispose = function () { + var scope = this.currentScope; + while (scope !== null) { + scope.handleStore = null; + scope.id = 0; + scope.parent = null; + scope.start = HandleStore.MIN_ID; + scope.end = HandleStore.MIN_ID; + scope._escapeCalled = false; + var child = scope.child; + scope.child = null; + scope = child; + } + this.currentScope = null; + }; + return ScopeStore; +})(); + +var RefTracker = /*#__PURE__*/ (function () { + function RefTracker() { + this._next = null; + this._prev = null; + } + /** @virtual */ + RefTracker.prototype.finalize = function () {}; + RefTracker.prototype.link = function (list) { + this._prev = list; + this._next = list._next; + if (this._next !== null) { + this._next._prev = this; + } + list._next = this; + }; + RefTracker.prototype.unlink = function () { + if (this._prev !== null) { + this._prev._next = this._next; + } + if (this._next !== null) { + this._next._prev = this._prev; + } + this._prev = null; + this._next = null; + }; + RefTracker.finalizeAll = function (list) { + while (list._next !== null) { + list._next.finalize(); + } + }; + return RefTracker; +})(); var Finalizer = /*#__PURE__*/ (function () { - function Finalizer(envObject, _finalizeCallback, _finalizeData, _finalizeHint) { - if (_finalizeCallback === void 0) { _finalizeCallback = 0; } - if (_finalizeData === void 0) { _finalizeData = 0; } - if (_finalizeHint === void 0) { _finalizeHint = 0; } - this.envObject = envObject; - this._finalizeCallback = _finalizeCallback; - this._finalizeData = _finalizeData; - this._finalizeHint = _finalizeHint; - } - Finalizer.prototype.callback = function () { return this._finalizeCallback; }; - Finalizer.prototype.data = function () { return this._finalizeData; }; - Finalizer.prototype.hint = function () { return this._finalizeHint; }; - Finalizer.prototype.resetFinalizer = function () { - this._finalizeCallback = 0; - this._finalizeData = 0; - this._finalizeHint = 0; - }; - Finalizer.prototype.dispose = function () { - this.envObject = undefined; - }; - return Finalizer; -}()); + function Finalizer( + envObject, + _finalizeCallback, + _finalizeData, + _finalizeHint, + ) { + if (_finalizeCallback === void 0) { + _finalizeCallback = 0; + } + if (_finalizeData === void 0) { + _finalizeData = 0; + } + if (_finalizeHint === void 0) { + _finalizeHint = 0; + } + this.envObject = envObject; + this._finalizeCallback = _finalizeCallback; + this._finalizeData = _finalizeData; + this._finalizeHint = _finalizeHint; + } + Finalizer.prototype.callback = function () { + return this._finalizeCallback; + }; + Finalizer.prototype.data = function () { + return this._finalizeData; + }; + Finalizer.prototype.hint = function () { + return this._finalizeHint; + }; + Finalizer.prototype.resetFinalizer = function () { + this._finalizeCallback = 0; + this._finalizeData = 0; + this._finalizeHint = 0; + }; + Finalizer.prototype.dispose = function () { + this.envObject = undefined; + }; + return Finalizer; +})(); var TrackedFinalizer = /*#__PURE__*/ (function (_super) { - __extends(TrackedFinalizer, _super); - function TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint) { - var _this = _super.call(this, envObject, finalize_callback, finalize_data, finalize_hint) || this; - _this._next = null; - _this._prev = null; - _this.link(!finalize_callback ? envObject.reflist : envObject.finalizing_reflist); - return _this; - } - TrackedFinalizer.finalizeAll = function (list) { - RefTracker.finalizeAll(list); - }; - TrackedFinalizer.prototype.link = function (list) { - RefTracker.prototype.link.call(this, list); - }; - TrackedFinalizer.prototype.unlink = function () { - RefTracker.prototype.unlink.call(this); - }; - TrackedFinalizer.create = function (envObject, finalize_callback, finalize_data, finalize_hint) { - return new TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint); - }; - TrackedFinalizer.prototype.dispose = function () { - this.unlink(); - this.envObject.dequeueFinalizer(this); - _super.prototype.dispose.call(this); - }; - TrackedFinalizer.prototype.finalize = function () { - this.finalizeCore(true); - }; - TrackedFinalizer.prototype.finalizeCore = function (deleteMe) { - var finalize_callback = this._finalizeCallback; - var finalize_data = this._finalizeData; - var finalize_hint = this._finalizeHint; - this.resetFinalizer(); - this.unlink(); - var error; - var caught = false; - if (finalize_callback) { - var fini = Number(finalize_callback); - try { - this.envObject.callFinalizer(fini, finalize_data, finalize_hint); - } - catch (err) { - caught = true; - error = err; - } - } - if (deleteMe) { - this.dispose(); - } - if (caught) { - throw error; - } - }; - return TrackedFinalizer; -}(Finalizer)); + __extends(TrackedFinalizer, _super); + function TrackedFinalizer( + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ) { + var _this = + _super.call( + this, + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ) || this; + _this._next = null; + _this._prev = null; + _this.link( + !finalize_callback ? envObject.reflist : envObject.finalizing_reflist, + ); + return _this; + } + TrackedFinalizer.finalizeAll = function (list) { + RefTracker.finalizeAll(list); + }; + TrackedFinalizer.prototype.link = function (list) { + RefTracker.prototype.link.call(this, list); + }; + TrackedFinalizer.prototype.unlink = function () { + RefTracker.prototype.unlink.call(this); + }; + TrackedFinalizer.create = function ( + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ) { + return new TrackedFinalizer( + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ); + }; + TrackedFinalizer.prototype.dispose = function () { + this.unlink(); + this.envObject.dequeueFinalizer(this); + _super.prototype.dispose.call(this); + }; + TrackedFinalizer.prototype.finalize = function () { + this.finalizeCore(true); + }; + TrackedFinalizer.prototype.finalizeCore = function (deleteMe) { + var finalize_callback = this._finalizeCallback; + var finalize_data = this._finalizeData; + var finalize_hint = this._finalizeHint; + this.resetFinalizer(); + this.unlink(); + var error; + var caught = false; + if (finalize_callback) { + var fini = Number(finalize_callback); + try { + this.envObject.callFinalizer(fini, finalize_data, finalize_hint); + } catch (err) { + caught = true; + error = err; + } + } + if (deleteMe) { + this.dispose(); + } + if (caught) { + throw error; + } + }; + return TrackedFinalizer; +})(Finalizer); var RefBase = /*#__PURE__*/ (function (_super) { - __extends(RefBase, _super); - function RefBase(envObject, initial_refcount, ownership, finalize_callback, finalize_data, finalize_hint) { - var _this = _super.call(this, envObject, finalize_callback, finalize_data, finalize_hint) || this; - _this._refcount = initial_refcount; - _this._ownership = ownership; - return _this; - } - RefBase.prototype.data = function () { - return this._finalizeData; - }; - RefBase.prototype.ref = function () { - return ++this._refcount; - }; - RefBase.prototype.unref = function () { - if (this._refcount === 0) { - return 0; - } - return --this._refcount; - }; - RefBase.prototype.refCount = function () { - return this._refcount; - }; - RefBase.prototype.ownership = function () { - return this._ownership; - }; - RefBase.prototype.finalize = function () { - this.finalizeCore(this._ownership === 0 /* Ownership.kRuntime */); - }; - return RefBase; -}(TrackedFinalizer)); + __extends(RefBase, _super); + function RefBase( + envObject, + initial_refcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ) { + var _this = + _super.call( + this, + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ) || this; + _this._refcount = initial_refcount; + _this._ownership = ownership; + return _this; + } + RefBase.prototype.data = function () { + return this._finalizeData; + }; + RefBase.prototype.ref = function () { + return ++this._refcount; + }; + RefBase.prototype.unref = function () { + if (this._refcount === 0) { + return 0; + } + return --this._refcount; + }; + RefBase.prototype.refCount = function () { + return this._refcount; + }; + RefBase.prototype.ownership = function () { + return this._ownership; + }; + RefBase.prototype.finalize = function () { + this.finalizeCore(this._ownership === 0 /* Ownership.kRuntime */); + }; + return RefBase; +})(TrackedFinalizer); function throwNodeApiVersionError(moduleName, moduleApiVersion) { - var errorMessage = "".concat(moduleName, " requires Node-API version ").concat(moduleApiVersion, ", but this version of Node.js only supports version ").concat(NODE_API_SUPPORTED_VERSION_MAX, " add-ons."); - throw new Error(errorMessage); + var errorMessage = '' + .concat(moduleName, ' requires Node-API version ') + .concat( + moduleApiVersion, + ', but this version of Node.js only supports version ', + ) + .concat(NODE_API_SUPPORTED_VERSION_MAX, ' add-ons.'); + throw new Error(errorMessage); } function handleThrow(envObject, value) { - if (envObject.terminatedOrTerminating()) { - return; - } - throw value; + if (envObject.terminatedOrTerminating()) { + return; + } + throw value; } var Env = /*#__PURE__*/ (function () { - function Env(ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) { - this.ctx = ctx; - this.moduleApiVersion = moduleApiVersion; - this.makeDynCall_vppp = makeDynCall_vppp; - this.makeDynCall_vp = makeDynCall_vp; - this.abort = abort; - this.openHandleScopes = 0; - this.instanceData = null; - this.tryCatch = new TryCatch(); - this.refs = 1; - this.reflist = new RefTracker(); - this.finalizing_reflist = new RefTracker(); - this.pendingFinalizers = []; - this.lastError = { - errorCode: 0 /* napi_status.napi_ok */, - engineErrorCode: 0, - engineReserved: 0 - }; - this.inGcFinalizer = false; - this._bindingMap = new WeakMap(); - this.id = 0; + function Env(ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) { + this.ctx = ctx; + this.moduleApiVersion = moduleApiVersion; + this.makeDynCall_vppp = makeDynCall_vppp; + this.makeDynCall_vp = makeDynCall_vp; + this.abort = abort; + this.openHandleScopes = 0; + this.instanceData = null; + this.tryCatch = new TryCatch(); + this.refs = 1; + this.reflist = new RefTracker(); + this.finalizing_reflist = new RefTracker(); + this.pendingFinalizers = []; + this.lastError = { + errorCode: 0 /* napi_status.napi_ok */, + engineErrorCode: 0, + engineReserved: 0, + }; + this.inGcFinalizer = false; + this._bindingMap = new WeakMap(); + this.id = 0; + } + /** @virtual */ + Env.prototype.canCallIntoJs = function () { + return true; + }; + Env.prototype.terminatedOrTerminating = function () { + return !this.canCallIntoJs(); + }; + Env.prototype.ref = function () { + this.refs++; + }; + Env.prototype.unref = function () { + this.refs--; + if (this.refs === 0) { + this.dispose(); } - /** @virtual */ - Env.prototype.canCallIntoJs = function () { - return true; - }; - Env.prototype.terminatedOrTerminating = function () { - return !this.canCallIntoJs(); - }; - Env.prototype.ref = function () { - this.refs++; - }; - Env.prototype.unref = function () { - this.refs--; - if (this.refs === 0) { - this.dispose(); - } - }; - Env.prototype.ensureHandle = function (value) { - return this.ctx.ensureHandle(value); - }; - Env.prototype.ensureHandleId = function (value) { - return this.ensureHandle(value).id; - }; - Env.prototype.clearLastError = function () { - var lastError = this.lastError; - if (lastError.errorCode !== 0 /* napi_status.napi_ok */) - lastError.errorCode = 0 /* napi_status.napi_ok */; - if (lastError.engineErrorCode !== 0) - lastError.engineErrorCode = 0; - if (lastError.engineReserved !== 0) - lastError.engineReserved = 0; - return 0 /* napi_status.napi_ok */; - }; - Env.prototype.setLastError = function (error_code, engine_error_code, engine_reserved) { - if (engine_error_code === void 0) { engine_error_code = 0; } - if (engine_reserved === void 0) { engine_reserved = 0; } - var lastError = this.lastError; - if (lastError.errorCode !== error_code) - lastError.errorCode = error_code; - if (lastError.engineErrorCode !== engine_error_code) - lastError.engineErrorCode = engine_error_code; - if (lastError.engineReserved !== engine_reserved) - lastError.engineReserved = engine_reserved; - return error_code; - }; - Env.prototype.getReturnStatus = function () { - return !this.tryCatch.hasCaught() ? 0 /* napi_status.napi_ok */ : this.setLastError(10 /* napi_status.napi_pending_exception */); - }; - Env.prototype.callIntoModule = function (fn, handleException) { - if (handleException === void 0) { handleException = handleThrow; } - var openHandleScopesBefore = this.openHandleScopes; - this.clearLastError(); - var r = fn(this); - if (openHandleScopesBefore !== this.openHandleScopes) { - this.abort('open_handle_scopes != open_handle_scopes_before'); - } - if (this.tryCatch.hasCaught()) { - var err = this.tryCatch.extractException(); - handleException(this, err); - } - return r; - }; - /** @virtual */ - Env.prototype.callFinalizer = function (cb, data, hint) { - var f = this.makeDynCall_vppp(cb); - var env = this.id; - var scope = this.ctx.openScope(this); - try { - this.callIntoModule(function () { f(env, data, hint); }); - } - finally { - this.ctx.closeScope(this, scope); - } - }; - Env.prototype.invokeFinalizerFromGC = function (finalizer) { - if (this.moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) { - this.enqueueFinalizer(finalizer); - } - else { - var saved = this.inGcFinalizer; - this.inGcFinalizer = true; - try { - finalizer.finalize(); - } - finally { - this.inGcFinalizer = saved; - } - } - }; - Env.prototype.checkGCAccess = function () { - if (this.moduleApiVersion === NAPI_VERSION_EXPERIMENTAL && this.inGcFinalizer) { - this.abort('Finalizer is calling a function that may affect GC state.\n' + - 'The finalizers are run directly from GC and must not affect GC ' + - 'state.\n' + - 'Use `node_api_post_finalizer` from inside of the finalizer to work ' + - 'around this issue.\n' + - 'It schedules the call as a new task in the event loop.'); - } - }; - /** @virtual */ - Env.prototype.enqueueFinalizer = function (finalizer) { - if (this.pendingFinalizers.indexOf(finalizer) === -1) { - this.pendingFinalizers.push(finalizer); - } - }; - /** @virtual */ - Env.prototype.dequeueFinalizer = function (finalizer) { - var index = this.pendingFinalizers.indexOf(finalizer); - if (index !== -1) { - this.pendingFinalizers.splice(index, 1); - } - }; - /** @virtual */ - Env.prototype.deleteMe = function () { - RefBase.finalizeAll(this.finalizing_reflist); - RefBase.finalizeAll(this.reflist); - this.tryCatch.extractException(); - this.ctx.envStore.remove(this.id); - }; - Env.prototype.dispose = function () { - if (this.id === 0) - return; - this.deleteMe(); - this.id = 0; - }; - Env.prototype.initObjectBinding = function (value) { - var binding = { - wrapped: 0, - tag: null, - data: 0 - }; - this._bindingMap.set(value, binding); - return binding; - }; - Env.prototype.getObjectBinding = function (value) { - if (this._bindingMap.has(value)) { - return this._bindingMap.get(value); - } - return this.initObjectBinding(value); - }; - Env.prototype.setInstanceData = function (data, finalize_cb, finalize_hint) { - if (this.instanceData) { - this.instanceData.dispose(); - } - this.instanceData = new RefBase(this, 0, 0 /* Ownership.kRuntime */, finalize_cb, data, finalize_hint); - }; - Env.prototype.getInstanceData = function () { - return this.instanceData ? this.instanceData.data() : 0; - }; - return Env; -}()); + }; + Env.prototype.ensureHandle = function (value) { + return this.ctx.ensureHandle(value); + }; + Env.prototype.ensureHandleId = function (value) { + return this.ensureHandle(value).id; + }; + Env.prototype.clearLastError = function () { + var lastError = this.lastError; + if (lastError.errorCode !== 0 /* napi_status.napi_ok */) + lastError.errorCode = 0 /* napi_status.napi_ok */; + if (lastError.engineErrorCode !== 0) lastError.engineErrorCode = 0; + if (lastError.engineReserved !== 0) lastError.engineReserved = 0; + return 0 /* napi_status.napi_ok */; + }; + Env.prototype.setLastError = function ( + error_code, + engine_error_code, + engine_reserved, + ) { + if (engine_error_code === void 0) { + engine_error_code = 0; + } + if (engine_reserved === void 0) { + engine_reserved = 0; + } + var lastError = this.lastError; + if (lastError.errorCode !== error_code) lastError.errorCode = error_code; + if (lastError.engineErrorCode !== engine_error_code) + lastError.engineErrorCode = engine_error_code; + if (lastError.engineReserved !== engine_reserved) + lastError.engineReserved = engine_reserved; + return error_code; + }; + Env.prototype.getReturnStatus = function () { + return !this.tryCatch.hasCaught() + ? 0 /* napi_status.napi_ok */ + : this.setLastError(10 /* napi_status.napi_pending_exception */); + }; + Env.prototype.callIntoModule = function (fn, handleException) { + if (handleException === void 0) { + handleException = handleThrow; + } + var openHandleScopesBefore = this.openHandleScopes; + this.clearLastError(); + var r = fn(this); + if (openHandleScopesBefore !== this.openHandleScopes) { + this.abort('open_handle_scopes != open_handle_scopes_before'); + } + if (this.tryCatch.hasCaught()) { + var err = this.tryCatch.extractException(); + handleException(this, err); + } + return r; + }; + /** @virtual */ + Env.prototype.callFinalizer = function (cb, data, hint) { + var f = this.makeDynCall_vppp(cb); + var env = this.id; + var scope = this.ctx.openScope(this); + try { + this.callIntoModule(function () { + f(env, data, hint); + }); + } finally { + this.ctx.closeScope(this, scope); + } + }; + Env.prototype.invokeFinalizerFromGC = function (finalizer) { + if (this.moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) { + this.enqueueFinalizer(finalizer); + } else { + var saved = this.inGcFinalizer; + this.inGcFinalizer = true; + try { + finalizer.finalize(); + } finally { + this.inGcFinalizer = saved; + } + } + }; + Env.prototype.checkGCAccess = function () { + if ( + this.moduleApiVersion === NAPI_VERSION_EXPERIMENTAL && + this.inGcFinalizer + ) { + this.abort( + 'Finalizer is calling a function that may affect GC state.\n' + + 'The finalizers are run directly from GC and must not affect GC ' + + 'state.\n' + + 'Use `node_api_post_finalizer` from inside of the finalizer to work ' + + 'around this issue.\n' + + 'It schedules the call as a new task in the event loop.', + ); + } + }; + /** @virtual */ + Env.prototype.enqueueFinalizer = function (finalizer) { + if (this.pendingFinalizers.indexOf(finalizer) === -1) { + this.pendingFinalizers.push(finalizer); + } + }; + /** @virtual */ + Env.prototype.dequeueFinalizer = function (finalizer) { + var index = this.pendingFinalizers.indexOf(finalizer); + if (index !== -1) { + this.pendingFinalizers.splice(index, 1); + } + }; + /** @virtual */ + Env.prototype.deleteMe = function () { + RefBase.finalizeAll(this.finalizing_reflist); + RefBase.finalizeAll(this.reflist); + this.tryCatch.extractException(); + this.ctx.envStore.remove(this.id); + }; + Env.prototype.dispose = function () { + if (this.id === 0) return; + this.deleteMe(); + this.id = 0; + }; + Env.prototype.initObjectBinding = function (value) { + var binding = { + wrapped: 0, + tag: null, + data: 0, + }; + this._bindingMap.set(value, binding); + return binding; + }; + Env.prototype.getObjectBinding = function (value) { + if (this._bindingMap.has(value)) { + return this._bindingMap.get(value); + } + return this.initObjectBinding(value); + }; + Env.prototype.setInstanceData = function (data, finalize_cb, finalize_hint) { + if (this.instanceData) { + this.instanceData.dispose(); + } + this.instanceData = new RefBase( + this, + 0, + 0 /* Ownership.kRuntime */, + finalize_cb, + data, + finalize_hint, + ); + }; + Env.prototype.getInstanceData = function () { + return this.instanceData ? this.instanceData.data() : 0; + }; + return Env; +})(); var NodeEnv = /*#__PURE__*/ (function (_super) { - __extends(NodeEnv, _super); - function NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { - var _this = _super.call(this, ctx, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort) || this; - _this.filename = filename; - _this.nodeBinding = nodeBinding; - _this.destructing = false; + __extends(NodeEnv, _super); + function NodeEnv( + ctx, + filename, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + nodeBinding, + ) { + var _this = + _super.call( + this, + ctx, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + ) || this; + _this.filename = filename; + _this.nodeBinding = nodeBinding; + _this.destructing = false; + _this.finalizationScheduled = false; + return _this; + } + NodeEnv.prototype.deleteMe = function () { + this.destructing = true; + this.drainFinalizerQueue(); + _super.prototype.deleteMe.call(this); + }; + NodeEnv.prototype.canCallIntoJs = function () { + return ( + _super.prototype.canCallIntoJs.call(this) && this.ctx.canCallIntoJs() + ); + }; + NodeEnv.prototype.triggerFatalException = function (err) { + if (this.nodeBinding) { + this.nodeBinding.napi.fatalException(err); + } else { + { + throw err; + } + } + }; + NodeEnv.prototype.callbackIntoModule = function ( + enforceUncaughtExceptionPolicy, + fn, + ) { + return this.callIntoModule(fn, function (envObject, err) { + if (envObject.terminatedOrTerminating()) { + return; + } + var hasForceFlag = false; + if ( + envObject.moduleApiVersion < NAPI_VERSION_EXPERIMENTAL && + !hasForceFlag && + !enforceUncaughtExceptionPolicy + ) { + var warn = function (warning, type, code) { + if (warning instanceof Error) { + console.warn(warning.toString()); + } else { + var prefix = code ? '['.concat(code, '] ') : ''; + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + console.warn( + '' + .concat(prefix) + .concat(type || 'Warning', ': ') + .concat(warning), + ); + } + }; + warn( + 'Uncaught N-API callback exception detected, please run node with option --force-node-api-uncaught-exceptions-policy=true to handle those exceptions properly.', + 'DeprecationWarning', + 'DEP0168', + ); + return; + } + envObject.triggerFatalException(err); + }); + }; + NodeEnv.prototype.callFinalizer = function (cb, data, hint) { + this.callFinalizerInternal(1, cb, data, hint); + }; + NodeEnv.prototype.callFinalizerInternal = function ( + forceUncaught, + cb, + data, + hint, + ) { + var f = this.makeDynCall_vppp(cb); + var env = this.id; + var scope = this.ctx.openScope(this); + try { + this.callbackIntoModule(Boolean(forceUncaught), function () { + f(env, data, hint); + }); + } finally { + this.ctx.closeScope(this, scope); + } + }; + NodeEnv.prototype.enqueueFinalizer = function (finalizer) { + var _this = this; + _super.prototype.enqueueFinalizer.call(this, finalizer); + if (!this.finalizationScheduled && !this.destructing) { + this.finalizationScheduled = true; + this.ref(); + _setImmediate(function () { _this.finalizationScheduled = false; - return _this; + _this.unref(); + _this.drainFinalizerQueue(); + }); } - NodeEnv.prototype.deleteMe = function () { - this.destructing = true; - this.drainFinalizerQueue(); - _super.prototype.deleteMe.call(this); - }; - NodeEnv.prototype.canCallIntoJs = function () { - return _super.prototype.canCallIntoJs.call(this) && this.ctx.canCallIntoJs(); - }; - NodeEnv.prototype.triggerFatalException = function (err) { - if (this.nodeBinding) { - this.nodeBinding.napi.fatalException(err); - } - else { - { - throw err; - } - } - }; - NodeEnv.prototype.callbackIntoModule = function (enforceUncaughtExceptionPolicy, fn) { - return this.callIntoModule(fn, function (envObject, err) { - if (envObject.terminatedOrTerminating()) { - return; - } - var hasForceFlag = false; - if (envObject.moduleApiVersion < NAPI_VERSION_EXPERIMENTAL && !hasForceFlag && !enforceUncaughtExceptionPolicy) { - var warn = function (warning, type, code) { - if (warning instanceof Error) { - console.warn(warning.toString()); - } - else { - var prefix = code ? "[".concat(code, "] ") : ''; - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - console.warn("".concat(prefix).concat(type || 'Warning', ": ").concat(warning)); - } - }; - warn('Uncaught N-API callback exception detected, please run node with option --force-node-api-uncaught-exceptions-policy=true to handle those exceptions properly.', 'DeprecationWarning', 'DEP0168'); - return; - } - envObject.triggerFatalException(err); - }); - }; - NodeEnv.prototype.callFinalizer = function (cb, data, hint) { - this.callFinalizerInternal(1, cb, data, hint); - }; - NodeEnv.prototype.callFinalizerInternal = function (forceUncaught, cb, data, hint) { - var f = this.makeDynCall_vppp(cb); - var env = this.id; - var scope = this.ctx.openScope(this); - try { - this.callbackIntoModule(Boolean(forceUncaught), function () { f(env, data, hint); }); - } - finally { - this.ctx.closeScope(this, scope); - } - }; - NodeEnv.prototype.enqueueFinalizer = function (finalizer) { - var _this = this; - _super.prototype.enqueueFinalizer.call(this, finalizer); - if (!this.finalizationScheduled && !this.destructing) { - this.finalizationScheduled = true; - this.ref(); - _setImmediate(function () { - _this.finalizationScheduled = false; - _this.unref(); - _this.drainFinalizerQueue(); - }); - } - }; - NodeEnv.prototype.drainFinalizerQueue = function () { - while (this.pendingFinalizers.length > 0) { - var refTracker = this.pendingFinalizers.shift(); - refTracker.finalize(); - } - }; - return NodeEnv; -}(Env)); -function newEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { - moduleApiVersion = typeof moduleApiVersion !== 'number' ? NODE_API_DEFAULT_MODULE_API_VERSION : moduleApiVersion; - // Validate module_api_version. - if (moduleApiVersion < NODE_API_DEFAULT_MODULE_API_VERSION) { - moduleApiVersion = NODE_API_DEFAULT_MODULE_API_VERSION; - } - else if (moduleApiVersion > NODE_API_SUPPORTED_VERSION_MAX && moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL) { - throwNodeApiVersionError(filename, moduleApiVersion); - } - var env = new NodeEnv(ctx, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding); - ctx.envStore.add(env); - ctx.addCleanupHook(env, function () { env.unref(); }, 0); - return env; + }; + NodeEnv.prototype.drainFinalizerQueue = function () { + while (this.pendingFinalizers.length > 0) { + var refTracker = this.pendingFinalizers.shift(); + refTracker.finalize(); + } + }; + return NodeEnv; +})(Env); +function newEnv( + ctx, + filename, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + nodeBinding, +) { + moduleApiVersion = + typeof moduleApiVersion !== 'number' + ? NODE_API_DEFAULT_MODULE_API_VERSION + : moduleApiVersion; + // Validate module_api_version. + if (moduleApiVersion < NODE_API_DEFAULT_MODULE_API_VERSION) { + moduleApiVersion = NODE_API_DEFAULT_MODULE_API_VERSION; + } else if ( + moduleApiVersion > NODE_API_SUPPORTED_VERSION_MAX && + moduleApiVersion !== NAPI_VERSION_EXPERIMENTAL + ) { + throwNodeApiVersionError(filename, moduleApiVersion); + } + var env = new NodeEnv( + ctx, + filename, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + nodeBinding, + ); + ctx.envStore.add(env); + ctx.addCleanupHook( + env, + function () { + env.unref(); + }, + 0, + ); + return env; } var EmnapiError = /*#__PURE__*/ (function (_super) { - __extends(EmnapiError, _super); - function EmnapiError(message) { - var _newTarget = this.constructor; - var _this = _super.call(this, message) || this; - var ErrorConstructor = _newTarget; - var proto = ErrorConstructor.prototype; - if (!(_this instanceof EmnapiError)) { - var setPrototypeOf = Object.setPrototypeOf; - if (typeof setPrototypeOf === 'function') { - setPrototypeOf.call(Object, _this, proto); - } - else { - // eslint-disable-next-line no-proto - _this.__proto__ = proto; - } - if (typeof Error.captureStackTrace === 'function') { - Error.captureStackTrace(_this, ErrorConstructor); - } - } - return _this; + __extends(EmnapiError, _super); + function EmnapiError(message) { + var _newTarget = this.constructor; + var _this = _super.call(this, message) || this; + var ErrorConstructor = _newTarget; + var proto = ErrorConstructor.prototype; + if (!(_this instanceof EmnapiError)) { + var setPrototypeOf = Object.setPrototypeOf; + if (typeof setPrototypeOf === 'function') { + setPrototypeOf.call(Object, _this, proto); + } else { + // eslint-disable-next-line no-proto + _this.__proto__ = proto; + } + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(_this, ErrorConstructor); + } } - return EmnapiError; -}(Error)); + return _this; + } + return EmnapiError; +})(Error); Object.defineProperty(EmnapiError.prototype, 'name', { - configurable: true, - writable: true, - value: 'EmnapiError' + configurable: true, + writable: true, + value: 'EmnapiError', }); var NotSupportWeakRefError = /*#__PURE__*/ (function (_super) { - __extends(NotSupportWeakRefError, _super); - function NotSupportWeakRefError(api, message) { - return _super.call(this, "".concat(api, ": The current runtime does not support \"FinalizationRegistry\" and \"WeakRef\".").concat(message ? " ".concat(message) : '')) || this; - } - return NotSupportWeakRefError; -}(EmnapiError)); + __extends(NotSupportWeakRefError, _super); + function NotSupportWeakRefError(api, message) { + return ( + _super.call( + this, + '' + .concat( + api, + ': The current runtime does not support "FinalizationRegistry" and "WeakRef".', + ) + .concat(message ? ' '.concat(message) : ''), + ) || this + ); + } + return NotSupportWeakRefError; +})(EmnapiError); Object.defineProperty(NotSupportWeakRefError.prototype, 'name', { - configurable: true, - writable: true, - value: 'NotSupportWeakRefError' + configurable: true, + writable: true, + value: 'NotSupportWeakRefError', }); var NotSupportBufferError = /*#__PURE__*/ (function (_super) { - __extends(NotSupportBufferError, _super); - function NotSupportBufferError(api, message) { - return _super.call(this, "".concat(api, ": The current runtime does not support \"Buffer\". Consider using buffer polyfill to make sure `globalThis.Buffer` is defined.").concat(message ? " ".concat(message) : '')) || this; - } - return NotSupportBufferError; -}(EmnapiError)); + __extends(NotSupportBufferError, _super); + function NotSupportBufferError(api, message) { + return ( + _super.call( + this, + '' + .concat( + api, + ': The current runtime does not support "Buffer". Consider using buffer polyfill to make sure `globalThis.Buffer` is defined.', + ) + .concat(message ? ' '.concat(message) : ''), + ) || this + ); + } + return NotSupportBufferError; +})(EmnapiError); Object.defineProperty(NotSupportBufferError.prototype, 'name', { - configurable: true, - writable: true, - value: 'NotSupportBufferError' + configurable: true, + writable: true, + value: 'NotSupportBufferError', }); var StrongRef = /*#__PURE__*/ (function () { - function StrongRef(value) { - this._value = value; - } - StrongRef.prototype.deref = function () { - return this._value; - }; - StrongRef.prototype.dispose = function () { - this._value = undefined; - }; - return StrongRef; -}()); + function StrongRef(value) { + this._value = value; + } + StrongRef.prototype.deref = function () { + return this._value; + }; + StrongRef.prototype.dispose = function () { + this._value = undefined; + }; + return StrongRef; +})(); var Persistent = /*#__PURE__*/ (function () { - function Persistent(value) { + function Persistent(value) { + this._ref = new StrongRef(value); + } + Persistent.prototype.setWeak = function (param, callback) { + if ( + !supportFinalizer || + this._ref === undefined || + this._ref instanceof WeakRef + ) + return; + var value = this._ref.deref(); + try { + Persistent._registry.register(value, this, this); + var weakRef = new WeakRef(value); + this._ref.dispose(); + this._ref = weakRef; + this._param = param; + this._callback = callback; + } catch (err) { + if (typeof value === 'symbol'); + else { + throw err; + } + } + }; + Persistent.prototype.clearWeak = function () { + if (!supportFinalizer || this._ref === undefined) return; + if (this._ref instanceof WeakRef) { + try { + Persistent._registry.unregister(this); + } catch (_) {} + this._param = undefined; + this._callback = undefined; + var value = this._ref.deref(); + if (value === undefined) { + this._ref = value; + } else { this._ref = new StrongRef(value); + } } - Persistent.prototype.setWeak = function (param, callback) { - if (!supportFinalizer || this._ref === undefined || this._ref instanceof WeakRef) - return; - var value = this._ref.deref(); - try { - Persistent._registry.register(value, this, this); - var weakRef = new WeakRef(value); - this._ref.dispose(); - this._ref = weakRef; - this._param = param; - this._callback = callback; - } - catch (err) { - if (typeof value === 'symbol'); - else { - throw err; - } - } - }; - Persistent.prototype.clearWeak = function () { - if (!supportFinalizer || this._ref === undefined) - return; - if (this._ref instanceof WeakRef) { - try { - Persistent._registry.unregister(this); - } - catch (_) { } - this._param = undefined; - this._callback = undefined; - var value = this._ref.deref(); - if (value === undefined) { - this._ref = value; - } - else { - this._ref = new StrongRef(value); - } - } - }; - Persistent.prototype.reset = function () { - if (supportFinalizer) { - try { - Persistent._registry.unregister(this); - } - catch (_) { } - } - this._param = undefined; - this._callback = undefined; - if (this._ref instanceof StrongRef) { - this._ref.dispose(); - } - this._ref = undefined; - }; - Persistent.prototype.isEmpty = function () { - return this._ref === undefined; - }; - Persistent.prototype.deref = function () { - if (this._ref === undefined) - return undefined; - return this._ref.deref(); - }; - Persistent._registry = supportFinalizer - ? new FinalizationRegistry(function (value) { - value._ref = undefined; - var callback = value._callback; - var param = value._param; - value._callback = undefined; - value._param = undefined; - if (typeof callback === 'function') { - callback(param); - } - }) - : undefined; - return Persistent; -}()); + }; + Persistent.prototype.reset = function () { + if (supportFinalizer) { + try { + Persistent._registry.unregister(this); + } catch (_) {} + } + this._param = undefined; + this._callback = undefined; + if (this._ref instanceof StrongRef) { + this._ref.dispose(); + } + this._ref = undefined; + }; + Persistent.prototype.isEmpty = function () { + return this._ref === undefined; + }; + Persistent.prototype.deref = function () { + if (this._ref === undefined) return undefined; + return this._ref.deref(); + }; + Persistent._registry = supportFinalizer + ? new FinalizationRegistry(function (value) { + value._ref = undefined; + var callback = value._callback; + var param = value._param; + value._callback = undefined; + value._param = undefined; + if (typeof callback === 'function') { + callback(param); + } + }) + : undefined; + return Persistent; +})(); function weakCallback(ref) { - ref.persistent.reset(); - ref.envObject.invokeFinalizerFromGC(ref); + ref.persistent.reset(); + ref.envObject.invokeFinalizerFromGC(ref); } function canBeHeldWeakly(value) { - return value.isObject() || value.isFunction() || value.isSymbol(); + return value.isObject() || value.isFunction() || value.isSymbol(); } var Reference = /*#__PURE__*/ (function (_super) { - __extends(Reference, _super); - function Reference(envObject, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { - if (finalize_callback === void 0) { finalize_callback = 0; } - if (finalize_data === void 0) { finalize_data = 0; } - if (finalize_hint === void 0) { finalize_hint = 0; } - var _this = _super.call(this, envObject, initialRefcount >>> 0, ownership, finalize_callback, finalize_data, finalize_hint) || this; - _this.id = 0; - return _this; - } - Reference.create = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { - if (finalize_callback === void 0) { finalize_callback = 0; } - if (finalize_data === void 0) { finalize_data = 0; } - if (finalize_hint === void 0) { finalize_hint = 0; } - var handle = envObject.ctx.handleStore.get(handle_id); - var ref = new Reference(envObject, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint); - envObject.ctx.refStore.add(ref); - ref.canBeWeak = canBeHeldWeakly(handle); - ref.persistent = new Persistent(handle.value); - if (initialRefcount === 0) { - ref._setWeak(); - } - return ref; - }; - Reference.prototype.ref = function () { - if (this.persistent.isEmpty()) { - return 0; - } - var count = _super.prototype.ref.call(this); - if (count === 1 && this.canBeWeak) { - this.persistent.clearWeak(); - } - return count; - }; - Reference.prototype.unref = function () { - if (this.persistent.isEmpty()) { - return 0; - } - var oldRefcount = this.refCount(); - var refcount = _super.prototype.unref.call(this); - if (oldRefcount === 1 && refcount === 0) { - this._setWeak(); - } - return refcount; - }; - Reference.prototype.get = function () { - if (this.persistent.isEmpty()) { - return 0; - } - var obj = this.persistent.deref(); - var handle = this.envObject.ensureHandle(obj); - return handle.id; - }; - Reference.prototype._setWeak = function () { - if (this.canBeWeak) { - this.persistent.setWeak(this, weakCallback); - } - else { - this.persistent.reset(); - } - }; - Reference.prototype.finalize = function () { - this.persistent.reset(); - _super.prototype.finalize.call(this); - }; - Reference.prototype.dispose = function () { - if (this.id === 0) - return; - this.persistent.reset(); - this.envObject.ctx.refStore.remove(this.id); - _super.prototype.dispose.call(this); - this.id = 0; - }; - return Reference; -}(RefBase)); + __extends(Reference, _super); + function Reference( + envObject, + initialRefcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ) { + if (finalize_callback === void 0) { + finalize_callback = 0; + } + if (finalize_data === void 0) { + finalize_data = 0; + } + if (finalize_hint === void 0) { + finalize_hint = 0; + } + var _this = + _super.call( + this, + envObject, + initialRefcount >>> 0, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ) || this; + _this.id = 0; + return _this; + } + Reference.create = function ( + envObject, + handle_id, + initialRefcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ) { + if (finalize_callback === void 0) { + finalize_callback = 0; + } + if (finalize_data === void 0) { + finalize_data = 0; + } + if (finalize_hint === void 0) { + finalize_hint = 0; + } + var handle = envObject.ctx.handleStore.get(handle_id); + var ref = new Reference( + envObject, + initialRefcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ); + envObject.ctx.refStore.add(ref); + ref.canBeWeak = canBeHeldWeakly(handle); + ref.persistent = new Persistent(handle.value); + if (initialRefcount === 0) { + ref._setWeak(); + } + return ref; + }; + Reference.prototype.ref = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var count = _super.prototype.ref.call(this); + if (count === 1 && this.canBeWeak) { + this.persistent.clearWeak(); + } + return count; + }; + Reference.prototype.unref = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var oldRefcount = this.refCount(); + var refcount = _super.prototype.unref.call(this); + if (oldRefcount === 1 && refcount === 0) { + this._setWeak(); + } + return refcount; + }; + Reference.prototype.get = function () { + if (this.persistent.isEmpty()) { + return 0; + } + var obj = this.persistent.deref(); + var handle = this.envObject.ensureHandle(obj); + return handle.id; + }; + Reference.prototype._setWeak = function () { + if (this.canBeWeak) { + this.persistent.setWeak(this, weakCallback); + } else { + this.persistent.reset(); + } + }; + Reference.prototype.finalize = function () { + this.persistent.reset(); + _super.prototype.finalize.call(this); + }; + Reference.prototype.dispose = function () { + if (this.id === 0) return; + this.persistent.reset(); + this.envObject.ctx.refStore.remove(this.id); + _super.prototype.dispose.call(this); + this.id = 0; + }; + return Reference; +})(RefBase); var Deferred = /*#__PURE__*/ (function () { - function Deferred(ctx, value) { - this.id = 0; - this.ctx = ctx; - this.value = value; - } - Deferred.create = function (ctx, value) { - var deferred = new Deferred(ctx, value); - ctx.deferredStore.add(deferred); - return deferred; - }; - Deferred.prototype.resolve = function (value) { - this.value.resolve(value); - this.dispose(); - }; - Deferred.prototype.reject = function (reason) { - this.value.reject(reason); - this.dispose(); - }; - Deferred.prototype.dispose = function () { - this.ctx.deferredStore.remove(this.id); - this.id = 0; - this.value = null; - this.ctx = null; - }; - return Deferred; -}()); + function Deferred(ctx, value) { + this.id = 0; + this.ctx = ctx; + this.value = value; + } + Deferred.create = function (ctx, value) { + var deferred = new Deferred(ctx, value); + ctx.deferredStore.add(deferred); + return deferred; + }; + Deferred.prototype.resolve = function (value) { + this.value.resolve(value); + this.dispose(); + }; + Deferred.prototype.reject = function (reason) { + this.value.reject(reason); + this.dispose(); + }; + Deferred.prototype.dispose = function () { + this.ctx.deferredStore.remove(this.id); + this.id = 0; + this.value = null; + this.ctx = null; + }; + return Deferred; +})(); var Store = /*#__PURE__*/ (function () { - function Store() { - this._values = [undefined]; - this._values.length = 4; - this._size = 1; - this._freeList = []; - } - Store.prototype.add = function (value) { - var id; - if (this._freeList.length) { - id = this._freeList.shift(); - } - else { - id = this._size; - this._size++; - var capacity = this._values.length; - if (id >= capacity) { - this._values.length = capacity + (capacity >> 1) + 16; - } - } - value.id = id; - this._values[id] = value; - }; - Store.prototype.get = function (id) { - return this._values[id]; - }; - Store.prototype.has = function (id) { - return this._values[id] !== undefined; - }; - Store.prototype.remove = function (id) { - var value = this._values[id]; - if (value) { - value.id = 0; - this._values[id] = undefined; - this._freeList.push(Number(id)); - } - }; - Store.prototype.dispose = function () { - for (var i = 1; i < this._size; ++i) { - var value = this._values[i]; - value === null || value === void 0 ? void 0 : value.dispose(); - } - this._values = [undefined]; - this._size = 1; - this._freeList = []; - }; - return Store; -}()); + function Store() { + this._values = [undefined]; + this._values.length = 4; + this._size = 1; + this._freeList = []; + } + Store.prototype.add = function (value) { + var id; + if (this._freeList.length) { + id = this._freeList.shift(); + } else { + id = this._size; + this._size++; + var capacity = this._values.length; + if (id >= capacity) { + this._values.length = capacity + (capacity >> 1) + 16; + } + } + value.id = id; + this._values[id] = value; + }; + Store.prototype.get = function (id) { + return this._values[id]; + }; + Store.prototype.has = function (id) { + return this._values[id] !== undefined; + }; + Store.prototype.remove = function (id) { + var value = this._values[id]; + if (value) { + value.id = 0; + this._values[id] = undefined; + this._freeList.push(Number(id)); + } + }; + Store.prototype.dispose = function () { + for (var i = 1; i < this._size; ++i) { + var value = this._values[i]; + value === null || value === void 0 ? void 0 : value.dispose(); + } + this._values = [undefined]; + this._size = 1; + this._freeList = []; + }; + return Store; +})(); var CleanupHookCallback = /*#__PURE__*/ (function () { - function CleanupHookCallback(envObject, fn, arg, order) { - this.envObject = envObject; - this.fn = fn; - this.arg = arg; - this.order = order; - } - return CleanupHookCallback; -}()); + function CleanupHookCallback(envObject, fn, arg, order) { + this.envObject = envObject; + this.fn = fn; + this.arg = arg; + this.order = order; + } + return CleanupHookCallback; +})(); var CleanupQueue = /*#__PURE__*/ (function () { - function CleanupQueue() { - this._cleanupHooks = []; - this._cleanupHookCounter = 0; + function CleanupQueue() { + this._cleanupHooks = []; + this._cleanupHookCounter = 0; + } + CleanupQueue.prototype.empty = function () { + return this._cleanupHooks.length === 0; + }; + CleanupQueue.prototype.add = function (envObject, fn, arg) { + if ( + this._cleanupHooks.filter(function (hook) { + return ( + hook.envObject === envObject && hook.fn === fn && hook.arg === arg + ); + }).length > 0 + ) { + throw new Error('Can not add same fn and arg twice'); } - CleanupQueue.prototype.empty = function () { - return this._cleanupHooks.length === 0; - }; - CleanupQueue.prototype.add = function (envObject, fn, arg) { - if (this._cleanupHooks.filter(function (hook) { return (hook.envObject === envObject && hook.fn === fn && hook.arg === arg); }).length > 0) { - throw new Error('Can not add same fn and arg twice'); - } - this._cleanupHooks.push(new CleanupHookCallback(envObject, fn, arg, this._cleanupHookCounter++)); - }; - CleanupQueue.prototype.remove = function (envObject, fn, arg) { - for (var i = 0; i < this._cleanupHooks.length; ++i) { - var hook = this._cleanupHooks[i]; - if (hook.envObject === envObject && hook.fn === fn && hook.arg === arg) { - this._cleanupHooks.splice(i, 1); - return; - } - } - }; - CleanupQueue.prototype.drain = function () { - var hooks = this._cleanupHooks.slice(); - hooks.sort(function (a, b) { return (b.order - a.order); }); - for (var i = 0; i < hooks.length; ++i) { - var cb = hooks[i]; - if (typeof cb.fn === 'number') { - cb.envObject.makeDynCall_vp(cb.fn)(cb.arg); - } - else { - cb.fn(cb.arg); - } - this._cleanupHooks.splice(this._cleanupHooks.indexOf(cb), 1); - } - }; - CleanupQueue.prototype.dispose = function () { - this._cleanupHooks.length = 0; - this._cleanupHookCounter = 0; - }; - return CleanupQueue; -}()); + this._cleanupHooks.push( + new CleanupHookCallback(envObject, fn, arg, this._cleanupHookCounter++), + ); + }; + CleanupQueue.prototype.remove = function (envObject, fn, arg) { + for (var i = 0; i < this._cleanupHooks.length; ++i) { + var hook = this._cleanupHooks[i]; + if (hook.envObject === envObject && hook.fn === fn && hook.arg === arg) { + this._cleanupHooks.splice(i, 1); + return; + } + } + }; + CleanupQueue.prototype.drain = function () { + var hooks = this._cleanupHooks.slice(); + hooks.sort(function (a, b) { + return b.order - a.order; + }); + for (var i = 0; i < hooks.length; ++i) { + var cb = hooks[i]; + if (typeof cb.fn === 'number') { + cb.envObject.makeDynCall_vp(cb.fn)(cb.arg); + } else { + cb.fn(cb.arg); + } + this._cleanupHooks.splice(this._cleanupHooks.indexOf(cb), 1); + } + }; + CleanupQueue.prototype.dispose = function () { + this._cleanupHooks.length = 0; + this._cleanupHookCounter = 0; + }; + return CleanupQueue; +})(); var Context = /*#__PURE__*/ (function () { - function Context() { - this._isStopping = false; - this._canCallIntoJs = true; - this.envStore = new Store(); - this.scopeStore = new ScopeStore(); - this.refStore = new Store(); - this.deferredStore = new Store(); - this.handleStore = new HandleStore(); - this.cbinfoStack = new CallbackInfoStack(); - this.feature = { - supportReflect: supportReflect, - supportFinalizer: supportFinalizer, - supportWeakSymbol: supportWeakSymbol, - supportBigInt: supportBigInt, - supportNewFunction: supportNewFunction, - canSetFunctionName: canSetFunctionName, - setImmediate: _setImmediate, - Buffer: _Buffer, - MessageChannel: _MessageChannel - }; - this.cleanupQueue = new CleanupQueue(); + function Context() { + this._isStopping = false; + this._canCallIntoJs = true; + this.envStore = new Store(); + this.scopeStore = new ScopeStore(); + this.refStore = new Store(); + this.deferredStore = new Store(); + this.handleStore = new HandleStore(); + this.cbinfoStack = new CallbackInfoStack(); + this.feature = { + supportReflect: supportReflect, + supportFinalizer: supportFinalizer, + supportWeakSymbol: supportWeakSymbol, + supportBigInt: supportBigInt, + supportNewFunction: supportNewFunction, + canSetFunctionName: canSetFunctionName, + setImmediate: _setImmediate, + Buffer: _Buffer, + MessageChannel: _MessageChannel, + }; + this.cleanupQueue = new CleanupQueue(); + } + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + Context.prototype.getRuntimeVersions = function () { + return { + version: version, + NODE_API_SUPPORTED_VERSION_MAX: NODE_API_SUPPORTED_VERSION_MAX, + NAPI_VERSION_EXPERIMENTAL: NAPI_VERSION_EXPERIMENTAL, + NODE_API_DEFAULT_MODULE_API_VERSION: NODE_API_DEFAULT_MODULE_API_VERSION, + }; + }; + Context.prototype.createNotSupportWeakRefError = function (api, message) { + return new NotSupportWeakRefError(api, message); + }; + Context.prototype.createNotSupportBufferError = function (api, message) { + return new NotSupportBufferError(api, message); + }; + Context.prototype.createReference = function ( + envObject, + handle_id, + initialRefcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ) { + if (finalize_callback === void 0) { + finalize_callback = 0; } - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type - Context.prototype.getRuntimeVersions = function () { - return { - version: version, - NODE_API_SUPPORTED_VERSION_MAX: NODE_API_SUPPORTED_VERSION_MAX, - NAPI_VERSION_EXPERIMENTAL: NAPI_VERSION_EXPERIMENTAL, - NODE_API_DEFAULT_MODULE_API_VERSION: NODE_API_DEFAULT_MODULE_API_VERSION - }; - }; - Context.prototype.createNotSupportWeakRefError = function (api, message) { - return new NotSupportWeakRefError(api, message); - }; - Context.prototype.createNotSupportBufferError = function (api, message) { - return new NotSupportBufferError(api, message); - }; - Context.prototype.createReference = function (envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { - if (finalize_callback === void 0) { finalize_callback = 0; } - if (finalize_data === void 0) { finalize_data = 0; } - if (finalize_hint === void 0) { finalize_hint = 0; } - return Reference.create(envObject, handle_id, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint); - }; - Context.prototype.createDeferred = function (value) { - return Deferred.create(this, value); - }; - Context.prototype.createEnv = function (filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding) { - return newEnv(this, filename, moduleApiVersion, makeDynCall_vppp, makeDynCall_vp, abort, nodeBinding); - }; - Context.prototype.createTrackedFinalizer = function (envObject, finalize_callback, finalize_data, finalize_hint) { - return TrackedFinalizer.create(envObject, finalize_callback, finalize_data, finalize_hint); - }; - Context.prototype.getCurrentScope = function () { - return this.scopeStore.currentScope; - }; - Context.prototype.addToCurrentScope = function (value) { - return this.scopeStore.currentScope.add(value); - }; - Context.prototype.openScope = function (envObject) { - return this.scopeStore.openScope(envObject); - }; - Context.prototype.closeScope = function (envObject, _scope) { - this.scopeStore.closeScope(envObject); - }; - Context.prototype.ensureHandle = function (value) { - switch (value) { - case undefined: return HandleStore.UNDEFINED; - case null: return HandleStore.NULL; - case true: return HandleStore.TRUE; - case false: return HandleStore.FALSE; - case _global: return HandleStore.GLOBAL; - } - return this.addToCurrentScope(value); - }; - Context.prototype.addCleanupHook = function (envObject, fn, arg) { - this.cleanupQueue.add(envObject, fn, arg); - }; - Context.prototype.removeCleanupHook = function (envObject, fn, arg) { - this.cleanupQueue.remove(envObject, fn, arg); - }; - Context.prototype.runCleanup = function () { - while (!this.cleanupQueue.empty()) { - this.cleanupQueue.drain(); - } - }; - Context.prototype.increaseWaitingRequestCounter = function () { - var _a; - (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.increase(); - }; - Context.prototype.decreaseWaitingRequestCounter = function () { - var _a; - (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.decrease(); - }; - Context.prototype.setCanCallIntoJs = function (value) { - this._canCallIntoJs = value; - }; - Context.prototype.setStopping = function (value) { - this._isStopping = value; - }; - Context.prototype.canCallIntoJs = function () { - return this._canCallIntoJs && !this._isStopping; - }; - Context.prototype.destroy = function () { - this.setStopping(true); - this.setCanCallIntoJs(false); - this.runCleanup(); - }; - return Context; -}()); + if (finalize_data === void 0) { + finalize_data = 0; + } + if (finalize_hint === void 0) { + finalize_hint = 0; + } + return Reference.create( + envObject, + handle_id, + initialRefcount, + ownership, + finalize_callback, + finalize_data, + finalize_hint, + ); + }; + Context.prototype.createDeferred = function (value) { + return Deferred.create(this, value); + }; + Context.prototype.createEnv = function ( + filename, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + nodeBinding, + ) { + return newEnv( + this, + filename, + moduleApiVersion, + makeDynCall_vppp, + makeDynCall_vp, + abort, + nodeBinding, + ); + }; + Context.prototype.createTrackedFinalizer = function ( + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ) { + return TrackedFinalizer.create( + envObject, + finalize_callback, + finalize_data, + finalize_hint, + ); + }; + Context.prototype.getCurrentScope = function () { + return this.scopeStore.currentScope; + }; + Context.prototype.addToCurrentScope = function (value) { + return this.scopeStore.currentScope.add(value); + }; + Context.prototype.openScope = function (envObject) { + return this.scopeStore.openScope(envObject); + }; + Context.prototype.closeScope = function (envObject, _scope) { + this.scopeStore.closeScope(envObject); + }; + Context.prototype.ensureHandle = function (value) { + switch (value) { + case undefined: + return HandleStore.UNDEFINED; + case null: + return HandleStore.NULL; + case true: + return HandleStore.TRUE; + case false: + return HandleStore.FALSE; + case _global: + return HandleStore.GLOBAL; + } + return this.addToCurrentScope(value); + }; + Context.prototype.addCleanupHook = function (envObject, fn, arg) { + this.cleanupQueue.add(envObject, fn, arg); + }; + Context.prototype.removeCleanupHook = function (envObject, fn, arg) { + this.cleanupQueue.remove(envObject, fn, arg); + }; + Context.prototype.runCleanup = function () { + while (!this.cleanupQueue.empty()) { + this.cleanupQueue.drain(); + } + }; + Context.prototype.increaseWaitingRequestCounter = function () { + var _a; + (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.increase(); + }; + Context.prototype.decreaseWaitingRequestCounter = function () { + var _a; + (_a = this.refCounter) === null || _a === void 0 ? void 0 : _a.decrease(); + }; + Context.prototype.setCanCallIntoJs = function (value) { + this._canCallIntoJs = value; + }; + Context.prototype.setStopping = function (value) { + this._isStopping = value; + }; + Context.prototype.canCallIntoJs = function () { + return this._canCallIntoJs && !this._isStopping; + }; + Context.prototype.destroy = function () { + this.setStopping(true); + this.setCanCallIntoJs(false); + this.runCleanup(); + }; + return Context; +})(); var defaultContext; function createContext() { - return new Context(); + return new Context(); } function getDefaultContext() { - if (!defaultContext) { - defaultContext = createContext(); - } - return defaultContext; + if (!defaultContext) { + defaultContext = createContext(); + } + return defaultContext; } -const _WebAssembly = typeof WebAssembly !== 'undefined' +const _WebAssembly = + typeof WebAssembly !== 'undefined' ? WebAssembly : typeof WXWebAssembly !== 'undefined' - ? WXWebAssembly - : undefined; + ? WXWebAssembly + : undefined; if (!_WebAssembly) { - throw new Error('WebAssembly is not supported in this environment'); + throw new Error('WebAssembly is not supported in this environment'); } /* eslint-disable spaced-comment */ function validateObject(value, name) { - if (value === null || typeof value !== 'object') { - throw new TypeError(`${name} must be an object. Received ${value === null ? 'null' : typeof value}`); - } + if (value === null || typeof value !== 'object') { + throw new TypeError( + `${name} must be an object. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function validateArray(value, name) { - if (!Array.isArray(value)) { - throw new TypeError(`${name} must be an array. Received ${value === null ? 'null' : typeof value}`); - } + if (!Array.isArray(value)) { + throw new TypeError( + `${name} must be an array. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function validateBoolean(value, name) { - if (typeof value !== 'boolean') { - throw new TypeError(`${name} must be a boolean. Received ${value === null ? 'null' : typeof value}`); - } + if (typeof value !== 'boolean') { + throw new TypeError( + `${name} must be a boolean. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function validateString(value, name) { - if (typeof value !== 'string') { - throw new TypeError(`${name} must be a string. Received ${value === null ? 'null' : typeof value}`); - } + if (typeof value !== 'string') { + throw new TypeError( + `${name} must be a string. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function validateFunction(value, name) { - if (typeof value !== 'function') { - throw new TypeError(`${name} must be a function. Received ${value === null ? 'null' : typeof value}`); - } + if (typeof value !== 'function') { + throw new TypeError( + `${name} must be a function. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function validateUndefined(value, name) { - if (value !== undefined) { - throw new TypeError(`${name} must be undefined. Received ${value === null ? 'null' : typeof value}`); - } + if (value !== undefined) { + throw new TypeError( + `${name} must be undefined. Received ${ + value === null ? 'null' : typeof value + }`, + ); + } } function isPromiseLike(obj) { - return !!(obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'); + return !!( + obj && + (typeof obj === 'object' || typeof obj === 'function') && + typeof obj.then === 'function' + ); } function unsharedSlice(view, start, end) { - return ((typeof SharedArrayBuffer === 'function' && view.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(view.buffer.constructor) === '[object SharedArrayBuffer]')) - ? view.slice(start, end) - : view.subarray(start, end); + return (typeof SharedArrayBuffer === 'function' && + view.buffer instanceof SharedArrayBuffer) || + Object.prototype.toString.call(view.buffer.constructor) === + '[object SharedArrayBuffer]' + ? view.slice(start, end) + : view.subarray(start, end); } const CHAR_DOT = 46; /* . */ const CHAR_FORWARD_SLASH = 47; /* / */ function isPosixPathSeparator(code) { - return code === CHAR_FORWARD_SLASH; + return code === CHAR_FORWARD_SLASH; } function normalizeString(path, allowAboveRoot, separator, isPathSeparator) { - let res = ''; - let lastSegmentLength = 0; - let lastSlash = -1; - let dots = 0; - let code = 0; - for (let i = 0; i <= path.length; ++i) { - if (i < path.length) { - code = path.charCodeAt(i); - } - else if (isPathSeparator(code)) { - break; - } - else { - code = CHAR_FORWARD_SLASH; - } - if (isPathSeparator(code)) { - if (lastSlash === i - 1 || dots === 1); - else if (dots === 2) { - if (res.length < 2 || lastSegmentLength !== 2 || - res.charCodeAt(res.length - 1) !== CHAR_DOT || - res.charCodeAt(res.length - 2) !== CHAR_DOT) { - if (res.length > 2) { - const lastSlashIndex = res.indexOf(separator); - if (lastSlashIndex === -1) { - res = ''; - lastSegmentLength = 0; - } - else { - res = res.slice(0, lastSlashIndex); - lastSegmentLength = - res.length - 1 - res.indexOf(separator); - } - lastSlash = i; - dots = 0; - continue; - } - else if (res.length !== 0) { - res = ''; - lastSegmentLength = 0; - lastSlash = i; - dots = 0; - continue; - } - } - if (allowAboveRoot) { - res += res.length > 0 ? `${separator}..` : '..'; - lastSegmentLength = 2; - } - } - else { - if (res.length > 0) { - res += `${separator}${path.slice(lastSlash + 1, i)}`; - } - else { - res = path.slice(lastSlash + 1, i); - } - lastSegmentLength = i - lastSlash - 1; + let res = ''; + let lastSegmentLength = 0; + let lastSlash = -1; + let dots = 0; + let code = 0; + for (let i = 0; i <= path.length; ++i) { + if (i < path.length) { + code = path.charCodeAt(i); + } else if (isPathSeparator(code)) { + break; + } else { + code = CHAR_FORWARD_SLASH; + } + if (isPathSeparator(code)) { + if (lastSlash === i - 1 || dots === 1); + else if (dots === 2) { + if ( + res.length < 2 || + lastSegmentLength !== 2 || + res.charCodeAt(res.length - 1) !== CHAR_DOT || + res.charCodeAt(res.length - 2) !== CHAR_DOT + ) { + if (res.length > 2) { + const lastSlashIndex = res.indexOf(separator); + if (lastSlashIndex === -1) { + res = ''; + lastSegmentLength = 0; + } else { + res = res.slice(0, lastSlashIndex); + lastSegmentLength = res.length - 1 - res.indexOf(separator); } lastSlash = i; dots = 0; - } - else if (code === CHAR_DOT && dots !== -1) { - ++dots; - } - else { - dots = -1; - } + continue; + } else if (res.length !== 0) { + res = ''; + lastSegmentLength = 0; + lastSlash = i; + dots = 0; + continue; + } + } + if (allowAboveRoot) { + res += res.length > 0 ? `${separator}..` : '..'; + lastSegmentLength = 2; + } + } else { + if (res.length > 0) { + res += `${separator}${path.slice(lastSlash + 1, i)}`; + } else { + res = path.slice(lastSlash + 1, i); + } + lastSegmentLength = i - lastSlash - 1; + } + lastSlash = i; + dots = 0; + } else if (code === CHAR_DOT && dots !== -1) { + ++dots; + } else { + dots = -1; } - return res; + } + return res; } function resolve(...args) { - let resolvedPath = ''; - let resolvedAbsolute = false; - for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { - const path = i >= 0 ? args[i] : '/'; - validateString(path, 'path'); - // Skip empty entries - if (path.length === 0) { - continue; - } - resolvedPath = `${path}/${resolvedPath}`; - resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + let resolvedPath = ''; + let resolvedAbsolute = false; + for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + const path = i >= 0 ? args[i] : '/'; + validateString(path, 'path'); + // Skip empty entries + if (path.length === 0) { + continue; } - // At this point the path should be resolved to a full absolute path, but - // handle relative paths to be safe (might happen when process.cwd() fails) - // Normalize the path - resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, '/', isPosixPathSeparator); - if (resolvedAbsolute) { - return `/${resolvedPath}`; - } - return resolvedPath.length > 0 ? resolvedPath : '.'; + resolvedPath = `${path}/${resolvedPath}`; + resolvedAbsolute = path.charCodeAt(0) === CHAR_FORWARD_SLASH; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + // Normalize the path + resolvedPath = normalizeString( + resolvedPath, + !resolvedAbsolute, + '/', + isPosixPathSeparator, + ); + if (resolvedAbsolute) { + return `/${resolvedPath}`; + } + return resolvedPath.length > 0 ? resolvedPath : '.'; } -const FD_DATASYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(0)); -const FD_READ = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(1)); -const FD_SEEK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(2)); -const FD_FDSTAT_SET_FLAGS = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(3)); -const FD_SYNC = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(4)); -const FD_TELL = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(5)); -const FD_WRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(6)); -const FD_ADVISE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(7)); -const FD_ALLOCATE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(8)); -const PATH_CREATE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(9)); -const PATH_CREATE_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(10)); -const PATH_LINK_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(11)); -const PATH_LINK_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(12)); -const PATH_OPEN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(13)); -const FD_READDIR = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(14)); -const PATH_READLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(15)); -const PATH_RENAME_SOURCE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(16)); -const PATH_RENAME_TARGET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(17)); -const PATH_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(18)); -const PATH_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(19)); -const PATH_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(20)); -const FD_FILESTAT_GET = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(21)); -const FD_FILESTAT_SET_SIZE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(22)); -const FD_FILESTAT_SET_TIMES = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(23)); -const PATH_SYMLINK = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(24)); -const PATH_REMOVE_DIRECTORY = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(25)); -const PATH_UNLINK_FILE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(26)); -const POLL_FD_READWRITE = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(27)); -const SOCK_SHUTDOWN = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(28)); -const SOCK_ACCEPT = ( /*#__PURE__*/BigInt(1) << /*#__PURE__*/ BigInt(29)); +const FD_DATASYNC = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(0); +const FD_READ = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(1); +const FD_SEEK = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(2); +const FD_FDSTAT_SET_FLAGS = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(3); +const FD_SYNC = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(4); +const FD_TELL = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(5); +const FD_WRITE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(6); +const FD_ADVISE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(7); +const FD_ALLOCATE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(8); +const PATH_CREATE_DIRECTORY = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(9); +const PATH_CREATE_FILE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(10); +const PATH_LINK_SOURCE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(11); +const PATH_LINK_TARGET = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(12); +const PATH_OPEN = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(13); +const FD_READDIR = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(14); +const PATH_READLINK = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(15); +const PATH_RENAME_SOURCE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(16); +const PATH_RENAME_TARGET = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(17); +const PATH_FILESTAT_GET = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(18); +const PATH_FILESTAT_SET_SIZE = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(19); +const PATH_FILESTAT_SET_TIMES = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(20); +const FD_FILESTAT_GET = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(21); +const FD_FILESTAT_SET_SIZE = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(22); +const FD_FILESTAT_SET_TIMES = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(23); +const PATH_SYMLINK = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(24); +const PATH_REMOVE_DIRECTORY = + /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(25); +const PATH_UNLINK_FILE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(26); +const POLL_FD_READWRITE = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(27); +const SOCK_SHUTDOWN = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(28); +const SOCK_ACCEPT = /*#__PURE__*/ BigInt(1) << /*#__PURE__*/ BigInt(29); const WasiRights = { - FD_DATASYNC, - FD_READ, - FD_SEEK, - FD_FDSTAT_SET_FLAGS, - FD_SYNC, - FD_TELL, - FD_WRITE, - FD_ADVISE, - FD_ALLOCATE, - PATH_CREATE_DIRECTORY, - PATH_CREATE_FILE, - PATH_LINK_SOURCE, - PATH_LINK_TARGET, - PATH_OPEN, - FD_READDIR, - PATH_READLINK, - PATH_RENAME_SOURCE, - PATH_RENAME_TARGET, - PATH_FILESTAT_GET, - PATH_FILESTAT_SET_SIZE, - PATH_FILESTAT_SET_TIMES, - FD_FILESTAT_GET, - FD_FILESTAT_SET_SIZE, - FD_FILESTAT_SET_TIMES, - PATH_SYMLINK, - PATH_REMOVE_DIRECTORY, - PATH_UNLINK_FILE, - POLL_FD_READWRITE, - SOCK_SHUTDOWN, - SOCK_ACCEPT + FD_DATASYNC, + FD_READ, + FD_SEEK, + FD_FDSTAT_SET_FLAGS, + FD_SYNC, + FD_TELL, + FD_WRITE, + FD_ADVISE, + FD_ALLOCATE, + PATH_CREATE_DIRECTORY, + PATH_CREATE_FILE, + PATH_LINK_SOURCE, + PATH_LINK_TARGET, + PATH_OPEN, + FD_READDIR, + PATH_READLINK, + PATH_RENAME_SOURCE, + PATH_RENAME_TARGET, + PATH_FILESTAT_GET, + PATH_FILESTAT_SET_SIZE, + PATH_FILESTAT_SET_TIMES, + FD_FILESTAT_GET, + FD_FILESTAT_SET_SIZE, + FD_FILESTAT_SET_TIMES, + PATH_SYMLINK, + PATH_REMOVE_DIRECTORY, + PATH_UNLINK_FILE, + POLL_FD_READWRITE, + SOCK_SHUTDOWN, + SOCK_ACCEPT, }; function strerror(errno) { - switch (errno) { - case 0 /* WasiErrno.ESUCCESS */: return 'Success'; - case 1 /* WasiErrno.E2BIG */: return 'Argument list too long'; - case 2 /* WasiErrno.EACCES */: return 'Permission denied'; - case 3 /* WasiErrno.EADDRINUSE */: return 'Address in use'; - case 4 /* WasiErrno.EADDRNOTAVAIL */: return 'Address not available'; - case 5 /* WasiErrno.EAFNOSUPPORT */: return 'Address family not supported by protocol'; - case 6 /* WasiErrno.EAGAIN */: return 'Resource temporarily unavailable'; - case 7 /* WasiErrno.EALREADY */: return 'Operation already in progress'; - case 8 /* WasiErrno.EBADF */: return 'Bad file descriptor'; - case 9 /* WasiErrno.EBADMSG */: return 'Bad message'; - case 10 /* WasiErrno.EBUSY */: return 'Resource busy'; - case 11 /* WasiErrno.ECANCELED */: return 'Operation canceled'; - case 12 /* WasiErrno.ECHILD */: return 'No child null'; - case 13 /* WasiErrno.ECONNABORTED */: return 'Connection aborted'; - case 14 /* WasiErrno.ECONNREFUSED */: return 'Connection refused'; - case 15 /* WasiErrno.ECONNRESET */: return 'Connection reset by peer'; - case 16 /* WasiErrno.EDEADLK */: return 'Resource deadlock would occur'; - case 17 /* WasiErrno.EDESTADDRREQ */: return 'Destination address required'; - case 18 /* WasiErrno.EDOM */: return 'Domain error'; - case 19 /* WasiErrno.EDQUOT */: return 'Quota exceeded'; - case 20 /* WasiErrno.EEXIST */: return 'File exists'; - case 21 /* WasiErrno.EFAULT */: return 'Bad address'; - case 22 /* WasiErrno.EFBIG */: return 'File too large'; - case 23 /* WasiErrno.EHOSTUNREACH */: return 'Host is unreachable'; - case 24 /* WasiErrno.EIDRM */: return 'Identifier removed'; - case 25 /* WasiErrno.EILSEQ */: return 'Illegal byte sequence'; - case 26 /* WasiErrno.EINPROGRESS */: return 'Operation in progress'; - case 27 /* WasiErrno.EINTR */: return 'Interrupted system call'; - case 28 /* WasiErrno.EINVAL */: return 'Invalid argument'; - case 29 /* WasiErrno.EIO */: return 'I/O error'; - case 30 /* WasiErrno.EISCONN */: return 'Socket is connected'; - case 31 /* WasiErrno.EISDIR */: return 'Is a directory'; - case 32 /* WasiErrno.ELOOP */: return 'Symbolic link loop'; - case 33 /* WasiErrno.EMFILE */: return 'No file descriptors available'; - case 34 /* WasiErrno.EMLINK */: return 'Too many links'; - case 35 /* WasiErrno.EMSGSIZE */: return 'Message too large'; - case 36 /* WasiErrno.EMULTIHOP */: return 'Multihop attempted'; - case 37 /* WasiErrno.ENAMETOOLONG */: return 'Filename too long'; - case 38 /* WasiErrno.ENETDOWN */: return 'Network is down'; - case 39 /* WasiErrno.ENETRESET */: return 'Connection reset by network'; - case 40 /* WasiErrno.ENETUNREACH */: return 'Network unreachable'; - case 41 /* WasiErrno.ENFILE */: return 'Too many files open in system'; - case 42 /* WasiErrno.ENOBUFS */: return 'No buffer space available'; - case 43 /* WasiErrno.ENODEV */: return 'No such device'; - case 44 /* WasiErrno.ENOENT */: return 'No such file or directory'; - case 45 /* WasiErrno.ENOEXEC */: return 'Exec format error'; - case 46 /* WasiErrno.ENOLCK */: return 'No locks available'; - case 47 /* WasiErrno.ENOLINK */: return 'Link has been severed'; - case 48 /* WasiErrno.ENOMEM */: return 'Out of memory'; - case 49 /* WasiErrno.ENOMSG */: return 'No message of the desired type'; - case 50 /* WasiErrno.ENOPROTOOPT */: return 'Protocol not available'; - case 51 /* WasiErrno.ENOSPC */: return 'No space left on device'; - case 52 /* WasiErrno.ENOSYS */: return 'Function not implemented'; - case 53 /* WasiErrno.ENOTCONN */: return 'Socket not connected'; - case 54 /* WasiErrno.ENOTDIR */: return 'Not a directory'; - case 55 /* WasiErrno.ENOTEMPTY */: return 'Directory not empty'; - case 56 /* WasiErrno.ENOTRECOVERABLE */: return 'State not recoverable'; - case 57 /* WasiErrno.ENOTSOCK */: return 'Not a socket'; - case 58 /* WasiErrno.ENOTSUP */: return 'Not supported'; - case 59 /* WasiErrno.ENOTTY */: return 'Not a tty'; - case 60 /* WasiErrno.ENXIO */: return 'No such device or address'; - case 61 /* WasiErrno.EOVERFLOW */: return 'Value too large for data type'; - case 62 /* WasiErrno.EOWNERDEAD */: return 'Previous owner died'; - case 63 /* WasiErrno.EPERM */: return 'Operation not permitted'; - case 64 /* WasiErrno.EPIPE */: return 'Broken pipe'; - case 65 /* WasiErrno.EPROTO */: return 'Protocol error'; - case 66 /* WasiErrno.EPROTONOSUPPORT */: return 'Protocol not supported'; - case 67 /* WasiErrno.EPROTOTYPE */: return 'Protocol wrong type for socket'; - case 68 /* WasiErrno.ERANGE */: return 'Result not representable'; - case 69 /* WasiErrno.EROFS */: return 'Read-only file system'; - case 70 /* WasiErrno.ESPIPE */: return 'Invalid seek'; - case 71 /* WasiErrno.ESRCH */: return 'No such null'; - case 72 /* WasiErrno.ESTALE */: return 'Stale file handle'; - case 73 /* WasiErrno.ETIMEDOUT */: return 'Operation timed out'; - case 74 /* WasiErrno.ETXTBSY */: return 'Text file busy'; - case 75 /* WasiErrno.EXDEV */: return 'Cross-device link'; - case 76 /* WasiErrno.ENOTCAPABLE */: return 'Capabilities insufficient'; - default: return 'Unknown error'; - } + switch (errno) { + case 0 /* WasiErrno.ESUCCESS */: + return 'Success'; + case 1 /* WasiErrno.E2BIG */: + return 'Argument list too long'; + case 2 /* WasiErrno.EACCES */: + return 'Permission denied'; + case 3 /* WasiErrno.EADDRINUSE */: + return 'Address in use'; + case 4 /* WasiErrno.EADDRNOTAVAIL */: + return 'Address not available'; + case 5 /* WasiErrno.EAFNOSUPPORT */: + return 'Address family not supported by protocol'; + case 6 /* WasiErrno.EAGAIN */: + return 'Resource temporarily unavailable'; + case 7 /* WasiErrno.EALREADY */: + return 'Operation already in progress'; + case 8 /* WasiErrno.EBADF */: + return 'Bad file descriptor'; + case 9 /* WasiErrno.EBADMSG */: + return 'Bad message'; + case 10 /* WasiErrno.EBUSY */: + return 'Resource busy'; + case 11 /* WasiErrno.ECANCELED */: + return 'Operation canceled'; + case 12 /* WasiErrno.ECHILD */: + return 'No child null'; + case 13 /* WasiErrno.ECONNABORTED */: + return 'Connection aborted'; + case 14 /* WasiErrno.ECONNREFUSED */: + return 'Connection refused'; + case 15 /* WasiErrno.ECONNRESET */: + return 'Connection reset by peer'; + case 16 /* WasiErrno.EDEADLK */: + return 'Resource deadlock would occur'; + case 17 /* WasiErrno.EDESTADDRREQ */: + return 'Destination address required'; + case 18 /* WasiErrno.EDOM */: + return 'Domain error'; + case 19 /* WasiErrno.EDQUOT */: + return 'Quota exceeded'; + case 20 /* WasiErrno.EEXIST */: + return 'File exists'; + case 21 /* WasiErrno.EFAULT */: + return 'Bad address'; + case 22 /* WasiErrno.EFBIG */: + return 'File too large'; + case 23 /* WasiErrno.EHOSTUNREACH */: + return 'Host is unreachable'; + case 24 /* WasiErrno.EIDRM */: + return 'Identifier removed'; + case 25 /* WasiErrno.EILSEQ */: + return 'Illegal byte sequence'; + case 26 /* WasiErrno.EINPROGRESS */: + return 'Operation in progress'; + case 27 /* WasiErrno.EINTR */: + return 'Interrupted system call'; + case 28 /* WasiErrno.EINVAL */: + return 'Invalid argument'; + case 29 /* WasiErrno.EIO */: + return 'I/O error'; + case 30 /* WasiErrno.EISCONN */: + return 'Socket is connected'; + case 31 /* WasiErrno.EISDIR */: + return 'Is a directory'; + case 32 /* WasiErrno.ELOOP */: + return 'Symbolic link loop'; + case 33 /* WasiErrno.EMFILE */: + return 'No file descriptors available'; + case 34 /* WasiErrno.EMLINK */: + return 'Too many links'; + case 35 /* WasiErrno.EMSGSIZE */: + return 'Message too large'; + case 36 /* WasiErrno.EMULTIHOP */: + return 'Multihop attempted'; + case 37 /* WasiErrno.ENAMETOOLONG */: + return 'Filename too long'; + case 38 /* WasiErrno.ENETDOWN */: + return 'Network is down'; + case 39 /* WasiErrno.ENETRESET */: + return 'Connection reset by network'; + case 40 /* WasiErrno.ENETUNREACH */: + return 'Network unreachable'; + case 41 /* WasiErrno.ENFILE */: + return 'Too many files open in system'; + case 42 /* WasiErrno.ENOBUFS */: + return 'No buffer space available'; + case 43 /* WasiErrno.ENODEV */: + return 'No such device'; + case 44 /* WasiErrno.ENOENT */: + return 'No such file or directory'; + case 45 /* WasiErrno.ENOEXEC */: + return 'Exec format error'; + case 46 /* WasiErrno.ENOLCK */: + return 'No locks available'; + case 47 /* WasiErrno.ENOLINK */: + return 'Link has been severed'; + case 48 /* WasiErrno.ENOMEM */: + return 'Out of memory'; + case 49 /* WasiErrno.ENOMSG */: + return 'No message of the desired type'; + case 50 /* WasiErrno.ENOPROTOOPT */: + return 'Protocol not available'; + case 51 /* WasiErrno.ENOSPC */: + return 'No space left on device'; + case 52 /* WasiErrno.ENOSYS */: + return 'Function not implemented'; + case 53 /* WasiErrno.ENOTCONN */: + return 'Socket not connected'; + case 54 /* WasiErrno.ENOTDIR */: + return 'Not a directory'; + case 55 /* WasiErrno.ENOTEMPTY */: + return 'Directory not empty'; + case 56 /* WasiErrno.ENOTRECOVERABLE */: + return 'State not recoverable'; + case 57 /* WasiErrno.ENOTSOCK */: + return 'Not a socket'; + case 58 /* WasiErrno.ENOTSUP */: + return 'Not supported'; + case 59 /* WasiErrno.ENOTTY */: + return 'Not a tty'; + case 60 /* WasiErrno.ENXIO */: + return 'No such device or address'; + case 61 /* WasiErrno.EOVERFLOW */: + return 'Value too large for data type'; + case 62 /* WasiErrno.EOWNERDEAD */: + return 'Previous owner died'; + case 63 /* WasiErrno.EPERM */: + return 'Operation not permitted'; + case 64 /* WasiErrno.EPIPE */: + return 'Broken pipe'; + case 65 /* WasiErrno.EPROTO */: + return 'Protocol error'; + case 66 /* WasiErrno.EPROTONOSUPPORT */: + return 'Protocol not supported'; + case 67 /* WasiErrno.EPROTOTYPE */: + return 'Protocol wrong type for socket'; + case 68 /* WasiErrno.ERANGE */: + return 'Result not representable'; + case 69 /* WasiErrno.EROFS */: + return 'Read-only file system'; + case 70 /* WasiErrno.ESPIPE */: + return 'Invalid seek'; + case 71 /* WasiErrno.ESRCH */: + return 'No such null'; + case 72 /* WasiErrno.ESTALE */: + return 'Stale file handle'; + case 73 /* WasiErrno.ETIMEDOUT */: + return 'Operation timed out'; + case 74 /* WasiErrno.ETXTBSY */: + return 'Text file busy'; + case 75 /* WasiErrno.EXDEV */: + return 'Cross-device link'; + case 76 /* WasiErrno.ENOTCAPABLE */: + return 'Capabilities insufficient'; + default: + return 'Unknown error'; + } } class WasiError extends Error { - constructor(message, errno) { - super(message); - this.errno = errno; - } - getErrorMessage() { - return strerror(this.errno); - } + constructor(message, errno) { + super(message); + this.errno = errno; + } + getErrorMessage() { + return strerror(this.errno); + } } Object.defineProperty(WasiError.prototype, 'name', { - configurable: true, - writable: true, - value: 'WasiError' + configurable: true, + writable: true, + value: 'WasiError', }); -const RIGHTS_ALL = WasiRights.FD_DATASYNC | - WasiRights.FD_READ | - WasiRights.FD_SEEK | - WasiRights.FD_FDSTAT_SET_FLAGS | - WasiRights.FD_SYNC | - WasiRights.FD_TELL | - WasiRights.FD_WRITE | - WasiRights.FD_ADVISE | - WasiRights.FD_ALLOCATE | - WasiRights.PATH_CREATE_DIRECTORY | - WasiRights.PATH_CREATE_FILE | - WasiRights.PATH_LINK_SOURCE | - WasiRights.PATH_LINK_TARGET | - WasiRights.PATH_OPEN | - WasiRights.FD_READDIR | - WasiRights.PATH_READLINK | - WasiRights.PATH_RENAME_SOURCE | - WasiRights.PATH_RENAME_TARGET | - WasiRights.PATH_FILESTAT_GET | - WasiRights.PATH_FILESTAT_SET_SIZE | - WasiRights.PATH_FILESTAT_SET_TIMES | - WasiRights.FD_FILESTAT_GET | - WasiRights.FD_FILESTAT_SET_TIMES | - WasiRights.FD_FILESTAT_SET_SIZE | - WasiRights.PATH_SYMLINK | - WasiRights.PATH_UNLINK_FILE | - WasiRights.PATH_REMOVE_DIRECTORY | - WasiRights.POLL_FD_READWRITE | - WasiRights.SOCK_SHUTDOWN | - WasiRights.SOCK_ACCEPT; +const RIGHTS_ALL = + WasiRights.FD_DATASYNC | + WasiRights.FD_READ | + WasiRights.FD_SEEK | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_TELL | + WasiRights.FD_WRITE | + WasiRights.FD_ADVISE | + WasiRights.FD_ALLOCATE | + WasiRights.PATH_CREATE_DIRECTORY | + WasiRights.PATH_CREATE_FILE | + WasiRights.PATH_LINK_SOURCE | + WasiRights.PATH_LINK_TARGET | + WasiRights.PATH_OPEN | + WasiRights.FD_READDIR | + WasiRights.PATH_READLINK | + WasiRights.PATH_RENAME_SOURCE | + WasiRights.PATH_RENAME_TARGET | + WasiRights.PATH_FILESTAT_GET | + WasiRights.PATH_FILESTAT_SET_SIZE | + WasiRights.PATH_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_SET_SIZE | + WasiRights.PATH_SYMLINK | + WasiRights.PATH_UNLINK_FILE | + WasiRights.PATH_REMOVE_DIRECTORY | + WasiRights.POLL_FD_READWRITE | + WasiRights.SOCK_SHUTDOWN | + WasiRights.SOCK_ACCEPT; const BLOCK_DEVICE_BASE = RIGHTS_ALL; const BLOCK_DEVICE_INHERITING = RIGHTS_ALL; const CHARACTER_DEVICE_BASE = RIGHTS_ALL; const CHARACTER_DEVICE_INHERITING = RIGHTS_ALL; -const REGULAR_FILE_BASE = WasiRights.FD_DATASYNC | - WasiRights.FD_READ | - WasiRights.FD_SEEK | - WasiRights.FD_FDSTAT_SET_FLAGS | - WasiRights.FD_SYNC | - WasiRights.FD_TELL | - WasiRights.FD_WRITE | - WasiRights.FD_ADVISE | - WasiRights.FD_ALLOCATE | - WasiRights.FD_FILESTAT_GET | - WasiRights.FD_FILESTAT_SET_SIZE | - WasiRights.FD_FILESTAT_SET_TIMES | - WasiRights.POLL_FD_READWRITE; +const REGULAR_FILE_BASE = + WasiRights.FD_DATASYNC | + WasiRights.FD_READ | + WasiRights.FD_SEEK | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_TELL | + WasiRights.FD_WRITE | + WasiRights.FD_ADVISE | + WasiRights.FD_ALLOCATE | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_SIZE | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.POLL_FD_READWRITE; const REGULAR_FILE_INHERITING = /*#__PURE__*/ BigInt(0); -const DIRECTORY_BASE = WasiRights.FD_FDSTAT_SET_FLAGS | - WasiRights.FD_SYNC | - WasiRights.FD_ADVISE | - WasiRights.PATH_CREATE_DIRECTORY | - WasiRights.PATH_CREATE_FILE | - WasiRights.PATH_LINK_SOURCE | - WasiRights.PATH_LINK_TARGET | - WasiRights.PATH_OPEN | - WasiRights.FD_READDIR | - WasiRights.PATH_READLINK | - WasiRights.PATH_RENAME_SOURCE | - WasiRights.PATH_RENAME_TARGET | - WasiRights.PATH_FILESTAT_GET | - WasiRights.PATH_FILESTAT_SET_SIZE | - WasiRights.PATH_FILESTAT_SET_TIMES | - WasiRights.FD_FILESTAT_GET | - WasiRights.FD_FILESTAT_SET_TIMES | - WasiRights.PATH_SYMLINK | - WasiRights.PATH_UNLINK_FILE | - WasiRights.PATH_REMOVE_DIRECTORY | - WasiRights.POLL_FD_READWRITE; +const DIRECTORY_BASE = + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_SYNC | + WasiRights.FD_ADVISE | + WasiRights.PATH_CREATE_DIRECTORY | + WasiRights.PATH_CREATE_FILE | + WasiRights.PATH_LINK_SOURCE | + WasiRights.PATH_LINK_TARGET | + WasiRights.PATH_OPEN | + WasiRights.FD_READDIR | + WasiRights.PATH_READLINK | + WasiRights.PATH_RENAME_SOURCE | + WasiRights.PATH_RENAME_TARGET | + WasiRights.PATH_FILESTAT_GET | + WasiRights.PATH_FILESTAT_SET_SIZE | + WasiRights.PATH_FILESTAT_SET_TIMES | + WasiRights.FD_FILESTAT_GET | + WasiRights.FD_FILESTAT_SET_TIMES | + WasiRights.PATH_SYMLINK | + WasiRights.PATH_UNLINK_FILE | + WasiRights.PATH_REMOVE_DIRECTORY | + WasiRights.POLL_FD_READWRITE; const DIRECTORY_INHERITING = DIRECTORY_BASE | REGULAR_FILE_BASE; -const SOCKET_BASE = (WasiRights.FD_READ | - WasiRights.FD_FDSTAT_SET_FLAGS | - WasiRights.FD_WRITE | - WasiRights.FD_FILESTAT_GET | - WasiRights.POLL_FD_READWRITE | - WasiRights.SOCK_SHUTDOWN); +const SOCKET_BASE = + WasiRights.FD_READ | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_WRITE | + WasiRights.FD_FILESTAT_GET | + WasiRights.POLL_FD_READWRITE | + WasiRights.SOCK_SHUTDOWN; const SOCKET_INHERITING = RIGHTS_ALL; -const TTY_BASE = WasiRights.FD_READ | - WasiRights.FD_FDSTAT_SET_FLAGS | - WasiRights.FD_WRITE | - WasiRights.FD_FILESTAT_GET | - WasiRights.POLL_FD_READWRITE; +const TTY_BASE = + WasiRights.FD_READ | + WasiRights.FD_FDSTAT_SET_FLAGS | + WasiRights.FD_WRITE | + WasiRights.FD_FILESTAT_GET | + WasiRights.POLL_FD_READWRITE; const TTY_INHERITING = /*#__PURE__*/ BigInt(0); function getRights(stdio, fd, flags, type) { - const ret = { - base: BigInt(0), - inheriting: BigInt(0) - }; - if (type === 0 /* WasiFileType.UNKNOWN */) { - throw new WasiError('Unknown file type', 28 /* WasiErrno.EINVAL */); - } - switch (type) { - case 4 /* WasiFileType.REGULAR_FILE */: - ret.base = REGULAR_FILE_BASE; - ret.inheriting = REGULAR_FILE_INHERITING; - break; - case 3 /* WasiFileType.DIRECTORY */: - ret.base = DIRECTORY_BASE; - ret.inheriting = DIRECTORY_INHERITING; - break; - case 6 /* WasiFileType.SOCKET_STREAM */: - case 5 /* WasiFileType.SOCKET_DGRAM */: - ret.base = SOCKET_BASE; - ret.inheriting = SOCKET_INHERITING; - break; - case 2 /* WasiFileType.CHARACTER_DEVICE */: - if (stdio.indexOf(fd) !== -1) { - ret.base = TTY_BASE; - ret.inheriting = TTY_INHERITING; - } - else { - ret.base = CHARACTER_DEVICE_BASE; - ret.inheriting = CHARACTER_DEVICE_INHERITING; - } - break; - case 1 /* WasiFileType.BLOCK_DEVICE */: - ret.base = BLOCK_DEVICE_BASE; - ret.inheriting = BLOCK_DEVICE_INHERITING; - break; - default: - ret.base = BigInt(0); - ret.inheriting = BigInt(0); - } - /* Disable read/write bits depending on access mode. */ - const read_or_write_only = flags & (0 | 1 | 2); - if (read_or_write_only === 0) { - ret.base &= ~WasiRights.FD_WRITE; - } - else if (read_or_write_only === 1) { - ret.base &= ~WasiRights.FD_READ; - } - return ret; + const ret = { + base: BigInt(0), + inheriting: BigInt(0), + }; + if (type === 0 /* WasiFileType.UNKNOWN */) { + throw new WasiError('Unknown file type', 28 /* WasiErrno.EINVAL */); + } + switch (type) { + case 4 /* WasiFileType.REGULAR_FILE */: + ret.base = REGULAR_FILE_BASE; + ret.inheriting = REGULAR_FILE_INHERITING; + break; + case 3 /* WasiFileType.DIRECTORY */: + ret.base = DIRECTORY_BASE; + ret.inheriting = DIRECTORY_INHERITING; + break; + case 6 /* WasiFileType.SOCKET_STREAM */: + case 5 /* WasiFileType.SOCKET_DGRAM */: + ret.base = SOCKET_BASE; + ret.inheriting = SOCKET_INHERITING; + break; + case 2 /* WasiFileType.CHARACTER_DEVICE */: + if (stdio.indexOf(fd) !== -1) { + ret.base = TTY_BASE; + ret.inheriting = TTY_INHERITING; + } else { + ret.base = CHARACTER_DEVICE_BASE; + ret.inheriting = CHARACTER_DEVICE_INHERITING; + } + break; + case 1 /* WasiFileType.BLOCK_DEVICE */: + ret.base = BLOCK_DEVICE_BASE; + ret.inheriting = BLOCK_DEVICE_INHERITING; + break; + default: + ret.base = BigInt(0); + ret.inheriting = BigInt(0); + } + /* Disable read/write bits depending on access mode. */ + const read_or_write_only = flags & (0 | 1 | 2); + if (read_or_write_only === 0) { + ret.base &= ~WasiRights.FD_WRITE; + } else if (read_or_write_only === 1) { + ret.base &= ~WasiRights.FD_READ; + } + return ret; } function concatBuffer(buffers, size) { - let total = 0; - { - for (let i = 0; i < buffers.length; i++) { - const buffer = buffers[i]; - total += buffer.length; - } - } - let pos = 0; - const ret = new Uint8Array(total); + let total = 0; + { for (let i = 0; i < buffers.length; i++) { - const buffer = buffers[i]; - ret.set(buffer, pos); - pos += buffer.length; + const buffer = buffers[i]; + total += buffer.length; } - return ret; + } + let pos = 0; + const ret = new Uint8Array(total); + for (let i = 0; i < buffers.length; i++) { + const buffer = buffers[i]; + ret.set(buffer, pos); + pos += buffer.length; + } + return ret; } class FileDescriptor { - constructor(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) { - this.id = id; - this.fd = fd; - this.path = path; - this.realPath = realPath; - this.type = type; - this.rightsBase = rightsBase; - this.rightsInheriting = rightsInheriting; - this.preopen = preopen; - this.pos = BigInt(0); - this.size = BigInt(0); - } - seek(offset, whence) { - if (whence === 0 /* WasiWhence.SET */) { - this.pos = BigInt(offset); - } - else if (whence === 1 /* WasiWhence.CUR */) { - this.pos += BigInt(offset); - } - else if (whence === 2 /* WasiWhence.END */) { - this.pos = BigInt(this.size) - BigInt(offset); - } - else { - throw new WasiError('Unknown whence', 29 /* WasiErrno.EIO */); - } - return this.pos; + constructor( + id, + fd, + path, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ) { + this.id = id; + this.fd = fd; + this.path = path; + this.realPath = realPath; + this.type = type; + this.rightsBase = rightsBase; + this.rightsInheriting = rightsInheriting; + this.preopen = preopen; + this.pos = BigInt(0); + this.size = BigInt(0); + } + seek(offset, whence) { + if (whence === 0 /* WasiWhence.SET */) { + this.pos = BigInt(offset); + } else if (whence === 1 /* WasiWhence.CUR */) { + this.pos += BigInt(offset); + } else if (whence === 2 /* WasiWhence.END */) { + this.pos = BigInt(this.size) - BigInt(offset); + } else { + throw new WasiError('Unknown whence', 29 /* WasiErrno.EIO */); } + return this.pos; + } } class StandardOutput extends FileDescriptor { - constructor(log, id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen) { - super(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen); - this._log = log; - this._buf = null; - } - write(buffer) { - const originalBuffer = buffer; - if (this._buf) { - buffer = concatBuffer([this._buf, buffer]); - this._buf = null; - } - if (buffer.indexOf(10) === -1) { - this._buf = buffer; - return originalBuffer.byteLength; - } - let written = 0; - let lastBegin = 0; - let index; - while ((index = buffer.indexOf(10, written)) !== -1) { - const str = new TextDecoder().decode(buffer.subarray(lastBegin, index)); - this._log(str); - written += index - lastBegin + 1; - lastBegin = index + 1; - } - if (written < buffer.length) { - this._buf = buffer.slice(written); - } - return originalBuffer.byteLength; + constructor( + log, + id, + fd, + path, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ) { + super(id, fd, path, realPath, type, rightsBase, rightsInheriting, preopen); + this._log = log; + this._buf = null; + } + write(buffer) { + const originalBuffer = buffer; + if (this._buf) { + buffer = concatBuffer([this._buf, buffer]); + this._buf = null; } + if (buffer.indexOf(10) === -1) { + this._buf = buffer; + return originalBuffer.byteLength; + } + let written = 0; + let lastBegin = 0; + let index; + while ((index = buffer.indexOf(10, written)) !== -1) { + const str = new TextDecoder().decode(buffer.subarray(lastBegin, index)); + this._log(str); + written += index - lastBegin + 1; + lastBegin = index + 1; + } + if (written < buffer.length) { + this._buf = buffer.slice(written); + } + return originalBuffer.byteLength; + } } function toFileType(stat) { - if (stat.isBlockDevice()) - return 1 /* WasiFileType.BLOCK_DEVICE */; - if (stat.isCharacterDevice()) - return 2 /* WasiFileType.CHARACTER_DEVICE */; - if (stat.isDirectory()) - return 3 /* WasiFileType.DIRECTORY */; - if (stat.isSocket()) - return 6 /* WasiFileType.SOCKET_STREAM */; - if (stat.isFile()) - return 4 /* WasiFileType.REGULAR_FILE */; - if (stat.isSymbolicLink()) - return 7 /* WasiFileType.SYMBOLIC_LINK */; - return 0 /* WasiFileType.UNKNOWN */; + if (stat.isBlockDevice()) return 1 /* WasiFileType.BLOCK_DEVICE */; + if (stat.isCharacterDevice()) return 2 /* WasiFileType.CHARACTER_DEVICE */; + if (stat.isDirectory()) return 3 /* WasiFileType.DIRECTORY */; + if (stat.isSocket()) return 6 /* WasiFileType.SOCKET_STREAM */; + if (stat.isFile()) return 4 /* WasiFileType.REGULAR_FILE */; + if (stat.isSymbolicLink()) return 7 /* WasiFileType.SYMBOLIC_LINK */; + return 0 /* WasiFileType.UNKNOWN */; } function toFileStat(view, buf, stat) { - view.setBigUint64(buf, stat.dev, true); - view.setBigUint64(buf + 8, stat.ino, true); - view.setBigUint64(buf + 16, BigInt(toFileType(stat)), true); - view.setBigUint64(buf + 24, stat.nlink, true); - view.setBigUint64(buf + 32, stat.size, true); - view.setBigUint64(buf + 40, stat.atimeMs * BigInt(1000000), true); - view.setBigUint64(buf + 48, stat.mtimeMs * BigInt(1000000), true); - view.setBigUint64(buf + 56, stat.ctimeMs * BigInt(1000000), true); + view.setBigUint64(buf, stat.dev, true); + view.setBigUint64(buf + 8, stat.ino, true); + view.setBigUint64(buf + 16, BigInt(toFileType(stat)), true); + view.setBigUint64(buf + 24, stat.nlink, true); + view.setBigUint64(buf + 32, stat.size, true); + view.setBigUint64(buf + 40, stat.atimeMs * BigInt(1000000), true); + view.setBigUint64(buf + 48, stat.mtimeMs * BigInt(1000000), true); + view.setBigUint64(buf + 56, stat.ctimeMs * BigInt(1000000), true); } class FileDescriptorTable { - constructor(options) { - this.used = 0; - this.size = options.size; - this.fds = Array(options.size); - this.stdio = [options.in, options.out, options.err]; - this.print = options.print; - this.printErr = options.printErr; - this.insertStdio(options.in, 0, ''); - this.insertStdio(options.out, 1, ''); - this.insertStdio(options.err, 2, ''); - } - insertStdio(fd, expected, name) { - const type = 2 /* WasiFileType.CHARACTER_DEVICE */; - const { base, inheriting } = getRights(this.stdio, fd, 2 /* FileControlFlag.O_RDWR */, type); - const wrap = this.insert(fd, name, name, type, base, inheriting, 0); - if (wrap.id !== expected) { - throw new WasiError(`id: ${wrap.id} !== expected: ${expected}`, 8 /* WasiErrno.EBADF */); - } - return wrap; - } - insert(fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen) { - var _a, _b; - let index = -1; - if (this.used >= this.size) { - const newSize = this.size * 2; - this.fds.length = newSize; - index = this.size; - this.size = newSize; - } - else { - for (let i = 0; i < this.size; ++i) { - if (this.fds[i] == null) { - index = i; - break; - } - } - } - let entry; - if (mappedPath === '') { - entry = new StandardOutput((_a = this.print) !== null && _a !== void 0 ? _a : console.log, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); - } - else if (mappedPath === '') { - entry = new StandardOutput((_b = this.printErr) !== null && _b !== void 0 ? _b : console.error, index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); - } - else { - entry = new FileDescriptor(index, fd, mappedPath, realPath, type, rightsBase, rightsInheriting, preopen); - } - this.fds[index] = entry; - this.used++; - return entry; + constructor(options) { + this.used = 0; + this.size = options.size; + this.fds = Array(options.size); + this.stdio = [options.in, options.out, options.err]; + this.print = options.print; + this.printErr = options.printErr; + this.insertStdio(options.in, 0, ''); + this.insertStdio(options.out, 1, ''); + this.insertStdio(options.err, 2, ''); + } + insertStdio(fd, expected, name) { + const type = 2; /* WasiFileType.CHARACTER_DEVICE */ + const { base, inheriting } = getRights( + this.stdio, + fd, + 2 /* FileControlFlag.O_RDWR */, + type, + ); + const wrap = this.insert(fd, name, name, type, base, inheriting, 0); + if (wrap.id !== expected) { + throw new WasiError( + `id: ${wrap.id} !== expected: ${expected}`, + 8 /* WasiErrno.EBADF */, + ); } - get(id, base, inheriting) { - if (id >= this.size) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - const entry = this.fds[id]; - if (!entry || entry.id !== id) { - throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); - } - /* Validate that the fd has the necessary rights. */ - if ((~entry.rightsBase & base) !== BigInt(0) || (~entry.rightsInheriting & inheriting) !== BigInt(0)) { - throw new WasiError('Capabilities insufficient', 76 /* WasiErrno.ENOTCAPABLE */); - } - return entry; + return wrap; + } + insert( + fd, + mappedPath, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ) { + var _a, _b; + let index = -1; + if (this.used >= this.size) { + const newSize = this.size * 2; + this.fds.length = newSize; + index = this.size; + this.size = newSize; + } else { + for (let i = 0; i < this.size; ++i) { + if (this.fds[i] == null) { + index = i; + break; + } + } } - remove(id) { - if (id >= this.size) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - const entry = this.fds[id]; - if (!entry || entry.id !== id) { - throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); - } - this.fds[id] = undefined; - this.used--; + let entry; + if (mappedPath === '') { + entry = new StandardOutput( + (_a = this.print) !== null && _a !== void 0 ? _a : console.log, + index, + fd, + mappedPath, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ); + } else if (mappedPath === '') { + entry = new StandardOutput( + (_b = this.printErr) !== null && _b !== void 0 ? _b : console.error, + index, + fd, + mappedPath, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ); + } else { + entry = new FileDescriptor( + index, + fd, + mappedPath, + realPath, + type, + rightsBase, + rightsInheriting, + preopen, + ); + } + this.fds[index] = entry; + this.used++; + return entry; + } + get(id, base, inheriting) { + if (id >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const entry = this.fds[id]; + if (!entry || entry.id !== id) { + throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); } + /* Validate that the fd has the necessary rights. */ + if ( + (~entry.rightsBase & base) !== BigInt(0) || + (~entry.rightsInheriting & inheriting) !== BigInt(0) + ) { + throw new WasiError( + 'Capabilities insufficient', + 76 /* WasiErrno.ENOTCAPABLE */, + ); + } + return entry; + } + remove(id) { + if (id >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); + } + const entry = this.fds[id]; + if (!entry || entry.id !== id) { + throw new WasiError('Bad file descriptor', 8 /* WasiErrno.EBADF */); + } + this.fds[id] = undefined; + this.used--; + } } class SyncTable extends FileDescriptorTable { - constructor(options) { - super(options); - this.fs = options.fs; - } - getFileTypeByFd(fd) { - const stats = this.fs.fstatSync(fd, { bigint: true }); - return toFileType(stats); + constructor(options) { + super(options); + this.fs = options.fs; + } + getFileTypeByFd(fd) { + const stats = this.fs.fstatSync(fd, { bigint: true }); + return toFileType(stats); + } + insertPreopen(fd, mappedPath, realPath) { + const type = this.getFileTypeByFd(fd); + if (type !== 3 /* WasiFileType.DIRECTORY */) { + throw new WasiError( + `Preopen not dir: ["${mappedPath}", "${realPath}"]`, + 54 /* WasiErrno.ENOTDIR */, + ); } - insertPreopen(fd, mappedPath, realPath) { - const type = this.getFileTypeByFd(fd); - if (type !== 3 /* WasiFileType.DIRECTORY */) { - throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */); - } - const result = getRights(this.stdio, fd, 0, type); - return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1); + const result = getRights(this.stdio, fd, 0, type); + return this.insert( + fd, + mappedPath, + realPath, + type, + result.base, + result.inheriting, + 1, + ); + } + renumber(dst, src) { + if (dst === src) return; + if (dst >= this.size || src >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); } - renumber(dst, src) { - if (dst === src) - return; - if (dst >= this.size || src >= this.size) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - const dstEntry = this.fds[dst]; - const srcEntry = this.fds[src]; - if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - this.fs.closeSync(dstEntry.fd); - this.fds[dst] = this.fds[src]; - this.fds[dst].id = dst; - this.fds[src] = undefined; - this.used--; + const dstEntry = this.fds[dst]; + const srcEntry = this.fds[src]; + if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); } + this.fs.closeSync(dstEntry.fd); + this.fds[dst] = this.fds[src]; + this.fds[dst].id = dst; + this.fds[src] = undefined; + this.used--; + } } class AsyncTable extends FileDescriptorTable { - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - constructor(options) { - super(options); + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(options) { + super(options); + } + async getFileTypeByFd(fd) { + const stats = await fd.stat({ bigint: true }); + return toFileType(stats); + } + async insertPreopen(fd, mappedPath, realPath) { + const type = await this.getFileTypeByFd(fd); + if (type !== 3 /* WasiFileType.DIRECTORY */) { + throw new WasiError( + `Preopen not dir: ["${mappedPath}", "${realPath}"]`, + 54 /* WasiErrno.ENOTDIR */, + ); } - async getFileTypeByFd(fd) { - const stats = await fd.stat({ bigint: true }); - return toFileType(stats); + const result = getRights(this.stdio, fd.fd, 0, type); + return this.insert( + fd, + mappedPath, + realPath, + type, + result.base, + result.inheriting, + 1, + ); + } + async renumber(dst, src) { + if (dst === src) return; + if (dst >= this.size || src >= this.size) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); } - async insertPreopen(fd, mappedPath, realPath) { - const type = await this.getFileTypeByFd(fd); - if (type !== 3 /* WasiFileType.DIRECTORY */) { - throw new WasiError(`Preopen not dir: ["${mappedPath}", "${realPath}"]`, 54 /* WasiErrno.ENOTDIR */); - } - const result = getRights(this.stdio, fd.fd, 0, type); - return this.insert(fd, mappedPath, realPath, type, result.base, result.inheriting, 1); - } - async renumber(dst, src) { - if (dst === src) - return; - if (dst >= this.size || src >= this.size) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - const dstEntry = this.fds[dst]; - const srcEntry = this.fds[src]; - if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { - throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); - } - await dstEntry.fd.close(); - this.fds[dst] = this.fds[src]; - this.fds[dst].id = dst; - this.fds[src] = undefined; - this.used--; + const dstEntry = this.fds[dst]; + const srcEntry = this.fds[src]; + if (!dstEntry || !srcEntry || dstEntry.id !== dst || srcEntry.id !== src) { + throw new WasiError('Invalid fd', 8 /* WasiErrno.EBADF */); } + await dstEntry.fd.close(); + this.fds[dst] = this.fds[src]; + this.fds[dst].id = dst; + this.fds[src] = undefined; + this.used--; + } } /** @public */ -const WebAssemblyMemory = /*#__PURE__*/ (function () { return _WebAssembly.Memory; })(); +const WebAssemblyMemory = /*#__PURE__*/ (function () { + return _WebAssembly.Memory; +})(); /** @public */ class Memory extends WebAssemblyMemory { - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - constructor(descriptor) { - super(descriptor); - } - get HEAP8() { return new Int8Array(super.buffer); } - get HEAPU8() { return new Uint8Array(super.buffer); } - get HEAP16() { return new Int16Array(super.buffer); } - get HEAPU16() { return new Uint16Array(super.buffer); } - get HEAP32() { return new Int32Array(super.buffer); } - get HEAPU32() { return new Uint32Array(super.buffer); } - get HEAP64() { return new BigInt64Array(super.buffer); } - get HEAPU64() { return new BigUint64Array(super.buffer); } - get HEAPF32() { return new Float32Array(super.buffer); } - get HEAPF64() { return new Float64Array(super.buffer); } - get view() { return new DataView(super.buffer); } + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(descriptor) { + super(descriptor); + } + get HEAP8() { + return new Int8Array(super.buffer); + } + get HEAPU8() { + return new Uint8Array(super.buffer); + } + get HEAP16() { + return new Int16Array(super.buffer); + } + get HEAPU16() { + return new Uint16Array(super.buffer); + } + get HEAP32() { + return new Int32Array(super.buffer); + } + get HEAPU32() { + return new Uint32Array(super.buffer); + } + get HEAP64() { + return new BigInt64Array(super.buffer); + } + get HEAPU64() { + return new BigUint64Array(super.buffer); + } + get HEAPF32() { + return new Float32Array(super.buffer); + } + get HEAPF64() { + return new Float64Array(super.buffer); + } + get view() { + return new DataView(super.buffer); + } } /** @public */ function extendMemory(memory) { - if (Object.getPrototypeOf(memory) === _WebAssembly.Memory.prototype) { - Object.setPrototypeOf(memory, Memory.prototype); - } - return memory; + if (Object.getPrototypeOf(memory) === _WebAssembly.Memory.prototype) { + Object.setPrototypeOf(memory, Memory.prototype); + } + return memory; } function checkWebAssemblyFunction() { - const WebAssemblyFunction = _WebAssembly.Function; - if (typeof WebAssemblyFunction !== 'function') { - throw new Error('WebAssembly.Function is not supported in this environment.' + - ' If you are using V8 based browser like Chrome, try to specify' + - ' --js-flags="--wasm-staging --experimental-wasm-stack-switching"'); - } - return WebAssemblyFunction; + const WebAssemblyFunction = _WebAssembly.Function; + if (typeof WebAssemblyFunction !== 'function') { + throw new Error( + 'WebAssembly.Function is not supported in this environment.' + + ' If you are using V8 based browser like Chrome, try to specify' + + ' --js-flags="--wasm-staging --experimental-wasm-stack-switching"', + ); + } + return WebAssemblyFunction; } /** @public */ function wrapAsyncImport(f, parameterType, returnType) { - const WebAssemblyFunction = checkWebAssemblyFunction(); - if (typeof f !== 'function') { - throw new TypeError('Function required'); - } - const parameters = parameterType.slice(0); - parameters.unshift('externref'); - return new WebAssemblyFunction({ parameters, results: returnType }, f, { suspending: 'first' }); + const WebAssemblyFunction = checkWebAssemblyFunction(); + if (typeof f !== 'function') { + throw new TypeError('Function required'); + } + const parameters = parameterType.slice(0); + parameters.unshift('externref'); + return new WebAssemblyFunction({ parameters, results: returnType }, f, { + suspending: 'first', + }); } function copyMemory(targets, src) { - if (targets.length === 0 || src.length === 0) - return 0; - let copied = 0; - let left = src.length - copied; - for (let i = 0; i < targets.length; ++i) { - const target = targets[i]; - if (left < target.length) { - target.set(src.subarray(copied, copied + left), 0); - copied += left; - left = 0; - return copied; - } - target.set(src.subarray(copied, copied + target.length), 0); - copied += target.length; - left -= target.length; - } - return copied; + if (targets.length === 0 || src.length === 0) return 0; + let copied = 0; + let left = src.length - copied; + for (let i = 0; i < targets.length; ++i) { + const target = targets[i]; + if (left < target.length) { + target.set(src.subarray(copied, copied + left), 0); + copied += left; + left = 0; + return copied; + } + target.set(src.subarray(copied, copied + target.length), 0); + copied += target.length; + left -= target.length; + } + return copied; } const _memory = new WeakMap(); const _wasi = new WeakMap(); const _fs = new WeakMap(); function getMemory(wasi) { - return _memory.get(wasi); + return _memory.get(wasi); } function getFs(wasi) { - const fs = _fs.get(wasi); - if (!fs) - throw new Error('filesystem is unavailable'); - return fs; + const fs = _fs.get(wasi); + if (!fs) throw new Error('filesystem is unavailable'); + return fs; } function handleError(err) { - if (err instanceof WasiError) { - return err.errno; - } - switch (err.code) { - case 'ENOENT': return 44 /* WasiErrno.ENOENT */; - case 'EBADF': return 8 /* WasiErrno.EBADF */; - case 'EINVAL': return 28 /* WasiErrno.EINVAL */; - case 'EPERM': return 63 /* WasiErrno.EPERM */; - case 'EPROTO': return 65 /* WasiErrno.EPROTO */; - case 'EEXIST': return 20 /* WasiErrno.EEXIST */; - case 'ENOTDIR': return 54 /* WasiErrno.ENOTDIR */; - case 'EMFILE': return 33 /* WasiErrno.EMFILE */; - case 'EACCES': return 2 /* WasiErrno.EACCES */; - case 'EISDIR': return 31 /* WasiErrno.EISDIR */; - case 'ENOTEMPTY': return 55 /* WasiErrno.ENOTEMPTY */; - case 'ENOSYS': return 52 /* WasiErrno.ENOSYS */; - } - throw err; + if (err instanceof WasiError) { + return err.errno; + } + switch (err.code) { + case 'ENOENT': + return 44 /* WasiErrno.ENOENT */; + case 'EBADF': + return 8 /* WasiErrno.EBADF */; + case 'EINVAL': + return 28 /* WasiErrno.EINVAL */; + case 'EPERM': + return 63 /* WasiErrno.EPERM */; + case 'EPROTO': + return 65 /* WasiErrno.EPROTO */; + case 'EEXIST': + return 20 /* WasiErrno.EEXIST */; + case 'ENOTDIR': + return 54 /* WasiErrno.ENOTDIR */; + case 'EMFILE': + return 33 /* WasiErrno.EMFILE */; + case 'EACCES': + return 2 /* WasiErrno.EACCES */; + case 'EISDIR': + return 31 /* WasiErrno.EISDIR */; + case 'ENOTEMPTY': + return 55 /* WasiErrno.ENOTEMPTY */; + case 'ENOSYS': + return 52 /* WasiErrno.ENOSYS */; + } + throw err; } function defineName(name, f) { - Object.defineProperty(f, 'name', { value: name }); - return f; -} -function syscallWrap(self, name, f) { - return defineName(name, function () { - let r; - try { - r = f.apply(self, arguments); - } - catch (err) { - return handleError(err); - } - if (isPromiseLike(r)) { - return r.then(_ => _, handleError); - } - return r; - }); -} -function resolvePathSync(fs, fileDescriptor, path, flags) { - let resolvedPath = resolve(fileDescriptor.realPath, path); - if ((flags & 1) === 1) { - try { - resolvedPath = fs.readlinkSync(resolvedPath); - } - catch (err) { - if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { - throw err; - } - } - } - return resolvedPath; -} -async function resolvePathAsync(fs, fileDescriptor, path, flags) { - let resolvedPath = resolve(fileDescriptor.realPath, path); - if ((flags & 1) === 1) { - try { - resolvedPath = await fs.promises.readlink(resolvedPath); - } - catch (err) { - if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { - throw err; - } - } - } - return resolvedPath; -} -// eslint-disable-next-line spaced-comment -const encoder = /*#__PURE__*/ new TextEncoder(); -// eslint-disable-next-line spaced-comment -const decoder = /*#__PURE__*/ new TextDecoder(); -const INT64_MAX = (BigInt(1) << BigInt(63)) - BigInt(1); -function readStdin() { - const value = window.prompt(); - if (value === null) - return new Uint8Array(); - const buffer = new TextEncoder().encode(value + '\n'); - return buffer; -} -function validateFstFlagsOrReturn(flags) { - return (Boolean((flags) & ~(1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */ | - 4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) || - ((flags) & (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */)) === - (1 /* WasiFstFlag.SET_ATIM */ | 2 /* WasiFstFlag.SET_ATIM_NOW */) || - ((flags) & (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)) === - (4 /* WasiFstFlag.SET_MTIM */ | 8 /* WasiFstFlag.SET_MTIM_NOW */)); -} -class WASI$1 { - constructor(args, env, fds, asyncFs, fs, asyncify) { - this.args_get = syscallWrap(this, 'args_get', function (argv, argv_buf) { - argv = Number(argv); - argv_buf = Number(argv_buf); - if (argv === 0 || argv_buf === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const args = wasi.args; - for (let i = 0; i < args.length; ++i) { - const arg = args[i]; - view.setInt32(argv, argv_buf, true); - argv += 4; - const data = encoder.encode(arg + '\0'); - HEAPU8.set(data, argv_buf); - argv_buf += data.length; - } - return 0 /* WasiErrno.ESUCCESS */; - }); - this.args_sizes_get = syscallWrap(this, 'args_sizes_get', function (argc, argv_buf_size) { - argc = Number(argc); - argv_buf_size = Number(argv_buf_size); - if (argc === 0 || argv_buf_size === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { view } = getMemory(this); - const wasi = _wasi.get(this); - const args = wasi.args; - view.setUint32(argc, args.length, true); - view.setUint32(argv_buf_size, encoder.encode(args.join('\0') + '\0').length, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.environ_get = syscallWrap(this, 'environ_get', function (environ, environ_buf) { - environ = Number(environ); - environ_buf = Number(environ_buf); - if (environ === 0 || environ_buf === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const env = wasi.env; - for (let i = 0; i < env.length; ++i) { - const pair = env[i]; - view.setInt32(environ, environ_buf, true); - environ += 4; - const data = encoder.encode(pair + '\0'); - HEAPU8.set(data, environ_buf); - environ_buf += data.length; - } - return 0 /* WasiErrno.ESUCCESS */; - }); - this.environ_sizes_get = syscallWrap(this, 'environ_sizes_get', function (len, buflen) { - len = Number(len); - buflen = Number(buflen); - if (len === 0 || buflen === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { view } = getMemory(this); - const wasi = _wasi.get(this); - view.setUint32(len, wasi.env.length, true); - view.setUint32(buflen, encoder.encode(wasi.env.join('\0') + '\0').length, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.clock_res_get = syscallWrap(this, 'clock_res_get', function (id, resolution) { - resolution = Number(resolution); - if (resolution === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { view } = getMemory(this); - switch (id) { - case 0 /* WasiClockid.REALTIME */: - view.setBigUint64(resolution, BigInt(1000000), true); - return 0 /* WasiErrno.ESUCCESS */; - case 1 /* WasiClockid.MONOTONIC */: - case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: - case 3 /* WasiClockid.THREAD_CPUTIME_ID */: - view.setBigUint64(resolution, BigInt(1000), true); - return 0 /* WasiErrno.ESUCCESS */; - default: return 28 /* WasiErrno.EINVAL */; - } - }); - this.clock_time_get = syscallWrap(this, 'clock_time_get', function (id, _percision, time) { - time = Number(time); - if (time === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { view } = getMemory(this); - switch (id) { - case 0 /* WasiClockid.REALTIME */: - view.setBigUint64(time, BigInt(Date.now()) * BigInt(1000000), true); - return 0 /* WasiErrno.ESUCCESS */; - case 1 /* WasiClockid.MONOTONIC */: - case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: - case 3 /* WasiClockid.THREAD_CPUTIME_ID */: { - const t = performance.now(); - const s = Math.trunc(t); - const ms = Math.floor((t - s) * 1000); - const result = BigInt(s) * BigInt(1000000000) + BigInt(ms) * BigInt(1000000); - view.setBigUint64(time, result, true); - return 0 /* WasiErrno.ESUCCESS */; - } - default: return 28 /* WasiErrno.EINVAL */; - } - }); - this.fd_advise = syscallWrap(this, 'fd_advise', function (_fd, _offset, _len, _advice) { - return 52 /* WasiErrno.ENOSYS */; - }); - this.fd_fdstat_get = syscallWrap(this, 'fd_fdstat_get', function (fd, fdstat) { - fdstat = Number(fdstat); - if (fdstat === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - const { view } = getMemory(this); - view.setUint16(fdstat, fileDescriptor.type, true); - view.setUint16(fdstat + 2, 0, true); - view.setBigUint64(fdstat + 8, fileDescriptor.rightsBase, true); - view.setBigUint64(fdstat + 16, fileDescriptor.rightsInheriting, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.fd_fdstat_set_flags = syscallWrap(this, 'fd_fdstat_set_flags', function (_fd, _flags) { - return 52 /* WasiErrno.ENOSYS */; - }); - this.fd_fdstat_set_rights = syscallWrap(this, 'fd_fdstat_set_rights', function (fd, rightsBase, rightsInheriting) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - if ((rightsBase | fileDescriptor.rightsBase) > fileDescriptor.rightsBase) { - return 76 /* WasiErrno.ENOTCAPABLE */; - } - if ((rightsInheriting | fileDescriptor.rightsInheriting) > - fileDescriptor.rightsInheriting) { - return 76 /* WasiErrno.ENOTCAPABLE */; - } - fileDescriptor.rightsBase = rightsBase; - fileDescriptor.rightsInheriting = rightsInheriting; - return 0 /* WasiErrno.ESUCCESS */; - }); - this.fd_prestat_get = syscallWrap(this, 'fd_prestat_get', function (fd, prestat) { - prestat = Number(prestat); - if (prestat === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - let fileDescriptor; - try { - fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - } - catch (err) { - if (err instanceof WasiError) - return err.errno; - throw err; - } - if (fileDescriptor.preopen !== 1) - return 28 /* WasiErrno.EINVAL */; - const { view } = getMemory(this); - // preopen type is dir(0) - view.setUint32(prestat, 0, true); - view.setUint32(prestat + 4, encoder.encode(fileDescriptor.path).length, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.fd_prestat_dir_name = syscallWrap(this, 'fd_prestat_dir_name', function (fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - if (fileDescriptor.preopen !== 1) - return 8 /* WasiErrno.EBADF */; - const buffer = encoder.encode(fileDescriptor.path); - const size = buffer.length; - if (size > path_len) - return 42 /* WasiErrno.ENOBUFS */; - const { HEAPU8 } = getMemory(this); - HEAPU8.set(buffer, path); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.fd_seek = syscallWrap(this, 'fd_seek', function (fd, offset, whence, newOffset) { - newOffset = Number(newOffset); - if (newOffset === 0) { - return 28 /* WasiErrno.EINVAL */; - } - if (fd === 0 || fd === 1 || fd === 2) - return 0 /* WasiErrno.ESUCCESS */; - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SEEK, BigInt(0)); - const r = fileDescriptor.seek(offset, whence); - const { view } = getMemory(this); - view.setBigUint64(newOffset, r, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.fd_tell = syscallWrap(this, 'fd_tell', function (fd, offset) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_TELL, BigInt(0)); - const pos = BigInt(fileDescriptor.pos); - const { view } = getMemory(this); - view.setBigUint64(Number(offset), pos, true); - return 0 /* WasiErrno.ESUCCESS */; - }); - this.poll_oneoff = syscallWrap(this, 'poll_oneoff', function (in_ptr, out_ptr, nsubscriptions, nevents) { - in_ptr = Number(in_ptr); - out_ptr = Number(out_ptr); - nevents = Number(nevents); - nsubscriptions = Number(nsubscriptions); - nsubscriptions = nsubscriptions >>> 0; - if (in_ptr === 0 || out_ptr === 0 || nsubscriptions === 0 || nevents === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { view } = getMemory(this); - view.setUint32(nevents, 0, true); - let i = 0; - let timer_userdata = BigInt(0); - let cur_timeout = BigInt(0); - let has_timeout = 0; - let min_timeout = BigInt(0); - let sub; - const subscriptions = Array(nsubscriptions); - for (i = 0; i < nsubscriptions; i++) { - sub = in_ptr + i * 48; - const userdata = view.getBigUint64(sub, true); - const type = view.getUint8(sub + 8); - const clockIdOrFd = view.getUint32(sub + 16, true); - const timeout = view.getBigUint64(sub + 24, true); - const precision = view.getBigUint64(sub + 32, true); - const flags = view.getUint16(sub + 40, true); - subscriptions[i] = { - userdata, - type, - u: { - clock: { - clock_id: clockIdOrFd, - timeout, - precision, - flags - }, - fd_readwrite: { - fd: clockIdOrFd - } - } - }; - } - const fdevents = []; - for (i = 0; i < nsubscriptions; i++) { - sub = subscriptions[i]; - switch (sub.type) { - case 0 /* WasiEventType.CLOCK */: { - if (sub.u.clock.flags === 1 /* WasiSubclockflags.ABSTIME */) { - /* Convert absolute time to relative delay. */ - const now = BigInt(Date.now()) * BigInt(1000000); - cur_timeout = sub.u.clock.timeout - now; - } - else { - cur_timeout = sub.u.clock.timeout; - } - if (has_timeout === 0 || cur_timeout < min_timeout) { - min_timeout = cur_timeout; - timer_userdata = sub.userdata; - has_timeout = 1; - } - break; - } - case 1 /* WasiEventType.FD_READ */: - case 2 /* WasiEventType.FD_WRITE */: - fdevents.push(sub); - break; - default: return 28 /* WasiErrno.EINVAL */; - } - } - if (fdevents.length > 0) { - for (i = 0; i < fdevents.length; i++) { - const fdevent = fdevents[i]; - const event = out_ptr + 32 * i; - view.setBigUint64(event, fdevent.userdata, true); - view.setUint32(event + 8, 52 /* WasiErrno.ENOSYS */, true); - view.setUint32(event + 12, fdevent.type, true); - view.setBigUint64(event + 16, BigInt(0), true); - view.setUint16(event + 24, 0, true); - view.setUint32(nevents, 1, true); - } - view.setUint32(nevents, fdevents.length, true); - return 0 /* WasiErrno.ESUCCESS */; - } - if (has_timeout) { - Number(min_timeout / BigInt(1000000)); - // } else { - // const buf = new SharedArrayBuffer(4) - // const arr = new Int32Array(buf) - // postMsg({ - // __tybys_wasm_util_wasi__: { - // type: 'set-timeout', - // payload: { - // buffer: buf, - // delay - // } - // } - // }) - // Atomics.wait(arr, 0, 0) - // } - const event = out_ptr; - view.setBigUint64(event, timer_userdata, true); - view.setUint32(event + 8, 0 /* WasiErrno.ESUCCESS */, true); - view.setUint32(event + 12, 0 /* WasiEventType.CLOCK */, true); - view.setUint32(nevents, 1, true); - } - return 0 /* WasiErrno.ESUCCESS */; - }); - this.proc_exit = syscallWrap(this, 'proc_exit', function (rval) { - return 0 /* WasiErrno.ESUCCESS */; - }); - this.proc_raise = syscallWrap(this, 'proc_raise', function (_sig) { - return 52 /* WasiErrno.ENOSYS */; - }); - this.sched_yield = syscallWrap(this, 'sched_yield', function () { - return 0 /* WasiErrno.ESUCCESS */; - }); - this.random_get = typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function' - ? syscallWrap(this, 'random_get', function (buf, buf_len) { - buf = Number(buf); - if (buf === 0) { - return 28 /* WasiErrno.EINVAL */; - } - buf_len = Number(buf_len); - const { HEAPU8, view } = getMemory(this); - if ((typeof SharedArrayBuffer === 'function' && HEAPU8.buffer instanceof SharedArrayBuffer) || - (Object.prototype.toString.call(HEAPU8.buffer) === '[object SharedArrayBuffer]')) { - for (let i = buf; i < buf + buf_len; ++i) { - view.setUint8(i, Math.floor(Math.random() * 256)); - } - return 0 /* WasiErrno.ESUCCESS */; - } - let pos; - const stride = 65536; - for (pos = 0; pos + stride < buf_len; pos += stride) { - crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + pos + stride)); - } - crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + buf_len)); - return 0 /* WasiErrno.ESUCCESS */; - }) - : syscallWrap(this, 'random_get', function (buf, buf_len) { - buf = Number(buf); - if (buf === 0) { - return 28 /* WasiErrno.EINVAL */; - } - buf_len = Number(buf_len); - const { view } = getMemory(this); - for (let i = buf; i < buf + buf_len; ++i) { - view.setUint8(i, Math.floor(Math.random() * 256)); - } - return 0 /* WasiErrno.ESUCCESS */; - }); - this.sock_recv = syscallWrap(this, 'sock_recv', function () { - return 58 /* WasiErrno.ENOTSUP */; - }); - this.sock_send = syscallWrap(this, 'sock_send', function () { - return 58 /* WasiErrno.ENOTSUP */; - }); - this.sock_shutdown = syscallWrap(this, 'sock_shutdown', function () { - return 58 /* WasiErrno.ENOTSUP */; - }); - this.sock_accept = syscallWrap(this, 'sock_accept', function () { - return 58 /* WasiErrno.ENOTSUP */; - }); - _wasi.set(this, { - fds, - args, - env - }); - if (fs) - _fs.set(this, fs); - // eslint-disable-next-line @typescript-eslint/no-this-alias - const _this = this; - function defineImport(name, syncVersion, asyncVersion, parameterType, returnType) { - if (asyncFs) { - if (asyncify) { - _this[name] = asyncify.wrapImportFunction(syscallWrap(_this, name, asyncVersion)); - } - else { - _this[name] = wrapAsyncImport(syscallWrap(_this, name, asyncVersion), parameterType, returnType); - } - } - else { - _this[name] = syscallWrap(_this, name, syncVersion); - } - } - defineImport('fd_allocate', function fd_allocate(fd, offset, len) { - const wasi = _wasi.get(this); - const fs = getFs(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0)); - const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); - if (stat.size < offset + len) { - fs.ftruncateSync(fileDescriptor.fd, Number(offset + len)); - } - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_allocate(fd, offset, len) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_ALLOCATE, BigInt(0)); - const h = fileDescriptor.fd; - const stat = await h.stat({ bigint: true }); - if (stat.size < offset + len) { - await h.truncate(Number(offset + len)); - } - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i64', 'f64'], ['i32']); - defineImport('fd_close', function fd_close(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - const fs = getFs(this); - fs.closeSync(fileDescriptor.fd); - wasi.fds.remove(fd); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_close(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); - await fileDescriptor.fd.close(); - wasi.fds.remove(fd); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32'], ['i32']); - defineImport('fd_datasync', function fd_datasync(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0)); - const fs = getFs(this); - fs.fdatasyncSync(fileDescriptor.fd); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_datasync(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_DATASYNC, BigInt(0)); - await fileDescriptor.fd.datasync(); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32'], ['i32']); - defineImport('fd_filestat_get', function fd_filestat_get(fd, buf) { - buf = Number(buf); - if (buf === 0) - return 28 /* WasiErrno.EINVAL */; - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0)); - const fs = getFs(this); - const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); - const { view } = getMemory(this); - toFileStat(view, buf, stat); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_filestat_get(fd, buf) { - buf = Number(buf); - if (buf === 0) - return 28 /* WasiErrno.EINVAL */; - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_GET, BigInt(0)); - const h = fileDescriptor.fd; - const stat = await h.stat({ bigint: true }); - const { view } = getMemory(this); - toFileStat(view, buf, stat); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32'], ['i32']); - defineImport('fd_filestat_set_size', function fd_filestat_set_size(fd, size) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0)); - const fs = getFs(this); - fs.ftruncateSync(fileDescriptor.fd, Number(size)); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_filestat_set_size(fd, size) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_SIZE, BigInt(0)); - const h = fileDescriptor.fd; - await h.truncate(Number(size)); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i64'], ['i32']); - function fdFilestatGetTimes(fd, atim, mtim, flags) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_FILESTAT_SET_TIMES, BigInt(0)); - if ((flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { - atim = BigInt(Date.now() * 1000000); - } - if ((flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { - mtim = BigInt(Date.now() * 1000000); - } - return { fileDescriptor, atim, mtim }; - } - defineImport('fd_filestat_set_times', function fd_filestat_set_times(fd, atim, mtim, flags) { - if (validateFstFlagsOrReturn(flags)) { - return 28 /* WasiErrno.EINVAL */; - } - const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); - const fs = getFs(this); - fs.futimesSync(fileDescriptor.fd, Number(atimRes), Number(mtimRes)); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_filestat_set_times(fd, atim, mtim, flags) { - if (validateFstFlagsOrReturn(flags)) { - return 28 /* WasiErrno.EINVAL */; - } - const { fileDescriptor, atim: atimRes, mtim: mtimRes } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); - const h = fileDescriptor.fd; - await h.utimes(Number(atimRes), Number(mtimRes)); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i64', 'i64', 'i32'], ['i32']); - defineImport('fd_pread', function fd_pread(fd, iovs, iovslen, offset, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - let totalSize = 0; - const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - totalSize += bufLen; - return HEAPU8.subarray(buf, buf + bufLen); - }); - let nread = 0; - const buffer = (() => { - try { - return new Uint8Array(new SharedArrayBuffer(totalSize)); - } - catch (_) { - return new Uint8Array(totalSize); - } - })(); - buffer._isBuffer = true; - const fs = getFs(this); - const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset)); - nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; - view.setUint32(size, nread, true); - return 0 /* WasiErrno.ESUCCESS */; - }, async function (fd, iovs, iovslen, offset, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ | WasiRights.FD_SEEK, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - let totalSize = 0; - const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - totalSize += bufLen; - return HEAPU8.subarray(buf, buf + bufLen); - }); - let nread = 0; - const buffer = new Uint8Array(totalSize); - buffer._isBuffer = true; - const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(offset)); - nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; - view.setUint32(size, nread, true); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); - defineImport('fd_pwrite', function fd_pwrite(fd, iovs, iovslen, offset, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - return HEAPU8.subarray(buf, buf + bufLen); - })); - const fs = getFs(this); - const nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(offset)); - view.setUint32(size, nwritten, true); + Object.defineProperty(f, 'name', { value: name }); + return f; +} +function syscallWrap(self, name, f) { + return defineName(name, function () { + let r; + try { + r = f.apply(self, arguments); + } catch (err) { + return handleError(err); + } + if (isPromiseLike(r)) { + return r.then((_) => _, handleError); + } + return r; + }); +} +function resolvePathSync(fs, fileDescriptor, path, flags) { + let resolvedPath = resolve(fileDescriptor.realPath, path); + if ((flags & 1) === 1) { + try { + resolvedPath = fs.readlinkSync(resolvedPath); + } catch (err) { + if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { + throw err; + } + } + } + return resolvedPath; +} +async function resolvePathAsync(fs, fileDescriptor, path, flags) { + let resolvedPath = resolve(fileDescriptor.realPath, path); + if ((flags & 1) === 1) { + try { + resolvedPath = await fs.promises.readlink(resolvedPath); + } catch (err) { + if (err.code !== 'EINVAL' && err.code !== 'ENOENT') { + throw err; + } + } + } + return resolvedPath; +} +// eslint-disable-next-line spaced-comment +const encoder = /*#__PURE__*/ new TextEncoder(); +// eslint-disable-next-line spaced-comment +const decoder = /*#__PURE__*/ new TextDecoder(); +const INT64_MAX = (BigInt(1) << BigInt(63)) - BigInt(1); +function readStdin() { + const value = window.prompt(); + if (value === null) return new Uint8Array(); + const buffer = new TextEncoder().encode(value + '\n'); + return buffer; +} +function validateFstFlagsOrReturn(flags) { + return ( + Boolean( + flags & + ~( + ( + 1 /* WasiFstFlag.SET_ATIM */ | + 2 /* WasiFstFlag.SET_ATIM_NOW */ | + 4 /* WasiFstFlag.SET_MTIM */ | + 8 + ) /* WasiFstFlag.SET_MTIM_NOW */ + ), + ) || + (flags & + (1 /* WasiFstFlag.SET_ATIM */ | 2)) /* WasiFstFlag.SET_ATIM_NOW */ === + (1 /* WasiFstFlag.SET_ATIM */ | 2) /* WasiFstFlag.SET_ATIM_NOW */ || + (flags & + (4 /* WasiFstFlag.SET_MTIM */ | 8)) /* WasiFstFlag.SET_MTIM_NOW */ === + (4 /* WasiFstFlag.SET_MTIM */ | 8) /* WasiFstFlag.SET_MTIM_NOW */ + ); +} +class WASI$1 { + constructor(args, env, fds, asyncFs, fs, asyncify) { + this.args_get = syscallWrap(this, 'args_get', function (argv, argv_buf) { + argv = Number(argv); + argv_buf = Number(argv_buf); + if (argv === 0 || argv_buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const args = wasi.args; + for (let i = 0; i < args.length; ++i) { + const arg = args[i]; + view.setInt32(argv, argv_buf, true); + argv += 4; + const data = encoder.encode(arg + '\0'); + HEAPU8.set(data, argv_buf); + argv_buf += data.length; + } + return 0 /* WasiErrno.ESUCCESS */; + }); + this.args_sizes_get = syscallWrap( + this, + 'args_sizes_get', + function (argc, argv_buf_size) { + argc = Number(argc); + argv_buf_size = Number(argv_buf_size); + if (argc === 0 || argv_buf_size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + const wasi = _wasi.get(this); + const args = wasi.args; + view.setUint32(argc, args.length, true); + view.setUint32( + argv_buf_size, + encoder.encode(args.join('\0') + '\0').length, + true, + ); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.environ_get = syscallWrap( + this, + 'environ_get', + function (environ, environ_buf) { + environ = Number(environ); + environ_buf = Number(environ_buf); + if (environ === 0 || environ_buf === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const env = wasi.env; + for (let i = 0; i < env.length; ++i) { + const pair = env[i]; + view.setInt32(environ, environ_buf, true); + environ += 4; + const data = encoder.encode(pair + '\0'); + HEAPU8.set(data, environ_buf); + environ_buf += data.length; + } + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.environ_sizes_get = syscallWrap( + this, + 'environ_sizes_get', + function (len, buflen) { + len = Number(len); + buflen = Number(buflen); + if (len === 0 || buflen === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + const wasi = _wasi.get(this); + view.setUint32(len, wasi.env.length, true); + view.setUint32( + buflen, + encoder.encode(wasi.env.join('\0') + '\0').length, + true, + ); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.clock_res_get = syscallWrap( + this, + 'clock_res_get', + function (id, resolution) { + resolution = Number(resolution); + if (resolution === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + switch (id) { + case 0 /* WasiClockid.REALTIME */: + view.setBigUint64(resolution, BigInt(1000000), true); return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_pwrite(fd, iovs, iovslen, offset, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE | WasiRights.FD_SEEK, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - return HEAPU8.subarray(buf, buf + bufLen); - })); - const { bytesWritten } = await fileDescriptor.fd.write(buffer, 0, buffer.length, Number(offset)); - view.setUint32(size, bytesWritten, true); + case 1 /* WasiClockid.MONOTONIC */: + case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: + case 3 /* WasiClockid.THREAD_CPUTIME_ID */: + view.setBigUint64(resolution, BigInt(1000), true); return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); - defineImport('fd_read', function fd_read(fd, iovs, iovslen, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - let totalSize = 0; - const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - totalSize += bufLen; - return HEAPU8.subarray(buf, buf + bufLen); - }); - let buffer; - let nread = 0; - if (fd === 0) { - if (typeof window === 'undefined' || typeof window.prompt !== 'function') { - return 58 /* WasiErrno.ENOTSUP */; - } - buffer = readStdin(); - nread = buffer ? copyMemory(ioVecs, buffer) : 0; - } - else { - buffer = (() => { - try { - return new Uint8Array(new SharedArrayBuffer(totalSize)); - } - catch (_) { - return new Uint8Array(totalSize); - } - })(); - buffer._isBuffer = true; - const fs = getFs(this); - const bytesRead = fs.readSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos)); - nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; - fileDescriptor.pos += BigInt(nread); - } - view.setUint32(size, nread, true); + default: + return 28 /* WasiErrno.EINVAL */; + } + }, + ); + this.clock_time_get = syscallWrap( + this, + 'clock_time_get', + function (id, _percision, time) { + time = Number(time); + if (time === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + switch (id) { + case 0 /* WasiClockid.REALTIME */: + view.setBigUint64(time, BigInt(Date.now()) * BigInt(1000000), true); return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_read(fd, iovs, iovslen, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - let totalSize = 0; - const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - totalSize += bufLen; - return HEAPU8.subarray(buf, buf + bufLen); - }); - let buffer; - let nread = 0; - if (fd === 0) { - if (typeof window === 'undefined' || typeof window.prompt !== 'function') { - return 58 /* WasiErrno.ENOTSUP */; - } - buffer = readStdin(); - nread = buffer ? copyMemory(ioVecs, buffer) : 0; - } - else { - buffer = new Uint8Array(totalSize); - buffer._isBuffer = true; - const { bytesRead } = await fileDescriptor.fd.read(buffer, 0, buffer.length, Number(fileDescriptor.pos)); - nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; - fileDescriptor.pos += BigInt(nread); - } - view.setUint32(size, nread, true); + case 1 /* WasiClockid.MONOTONIC */: + case 2 /* WasiClockid.PROCESS_CPUTIME_ID */: + case 3 /* WasiClockid.THREAD_CPUTIME_ID */: { + const t = performance.now(); + const s = Math.trunc(t); + const ms = Math.floor((t - s) * 1000); + const result = + BigInt(s) * BigInt(1000000000) + BigInt(ms) * BigInt(1000000); + view.setBigUint64(time, result, true); return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('fd_readdir', function fd_readdir(fd, buf, buf_len, cookie, bufused) { + } + default: + return 28 /* WasiErrno.EINVAL */; + } + }, + ); + this.fd_advise = syscallWrap( + this, + 'fd_advise', + function (_fd, _offset, _len, _advice) { + return 52 /* WasiErrno.ENOSYS */; + }, + ); + this.fd_fdstat_get = syscallWrap( + this, + 'fd_fdstat_get', + function (fd, fdstat) { + fdstat = Number(fdstat); + if (fdstat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + const { view } = getMemory(this); + view.setUint16(fdstat, fileDescriptor.type, true); + view.setUint16(fdstat + 2, 0, true); + view.setBigUint64(fdstat + 8, fileDescriptor.rightsBase, true); + view.setBigUint64(fdstat + 16, fileDescriptor.rightsInheriting, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.fd_fdstat_set_flags = syscallWrap( + this, + 'fd_fdstat_set_flags', + function (_fd, _flags) { + return 52 /* WasiErrno.ENOSYS */; + }, + ); + this.fd_fdstat_set_rights = syscallWrap( + this, + 'fd_fdstat_set_rights', + function (fd, rightsBase, rightsInheriting) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + if ( + (rightsBase | fileDescriptor.rightsBase) > + fileDescriptor.rightsBase + ) { + return 76 /* WasiErrno.ENOTCAPABLE */; + } + if ( + (rightsInheriting | fileDescriptor.rightsInheriting) > + fileDescriptor.rightsInheriting + ) { + return 76 /* WasiErrno.ENOTCAPABLE */; + } + fileDescriptor.rightsBase = rightsBase; + fileDescriptor.rightsInheriting = rightsInheriting; + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.fd_prestat_get = syscallWrap( + this, + 'fd_prestat_get', + function (fd, prestat) { + prestat = Number(prestat); + if (prestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let fileDescriptor; + try { + fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + } catch (err) { + if (err instanceof WasiError) return err.errno; + throw err; + } + if (fileDescriptor.preopen !== 1) return 28 /* WasiErrno.EINVAL */; + const { view } = getMemory(this); + // preopen type is dir(0) + view.setUint32(prestat, 0, true); + view.setUint32( + prestat + 4, + encoder.encode(fileDescriptor.path).length, + true, + ); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.fd_prestat_dir_name = syscallWrap( + this, + 'fd_prestat_dir_name', + function (fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + if (fileDescriptor.preopen !== 1) return 8 /* WasiErrno.EBADF */; + const buffer = encoder.encode(fileDescriptor.path); + const size = buffer.length; + if (size > path_len) return 42 /* WasiErrno.ENOBUFS */; + const { HEAPU8 } = getMemory(this); + HEAPU8.set(buffer, path); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.fd_seek = syscallWrap( + this, + 'fd_seek', + function (fd, offset, whence, newOffset) { + newOffset = Number(newOffset); + if (newOffset === 0) { + return 28 /* WasiErrno.EINVAL */; + } + if (fd === 0 || fd === 1 || fd === 2) return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SEEK, BigInt(0)); + const r = fileDescriptor.seek(offset, whence); + const { view } = getMemory(this); + view.setBigUint64(newOffset, r, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.fd_tell = syscallWrap(this, 'fd_tell', function (fd, offset) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_TELL, BigInt(0)); + const pos = BigInt(fileDescriptor.pos); + const { view } = getMemory(this); + view.setBigUint64(Number(offset), pos, true); + return 0 /* WasiErrno.ESUCCESS */; + }); + this.poll_oneoff = syscallWrap( + this, + 'poll_oneoff', + function (in_ptr, out_ptr, nsubscriptions, nevents) { + in_ptr = Number(in_ptr); + out_ptr = Number(out_ptr); + nevents = Number(nevents); + nsubscriptions = Number(nsubscriptions); + nsubscriptions = nsubscriptions >>> 0; + if ( + in_ptr === 0 || + out_ptr === 0 || + nsubscriptions === 0 || + nevents === 0 + ) { + return 28 /* WasiErrno.EINVAL */; + } + const { view } = getMemory(this); + view.setUint32(nevents, 0, true); + let i = 0; + let timer_userdata = BigInt(0); + let cur_timeout = BigInt(0); + let has_timeout = 0; + let min_timeout = BigInt(0); + let sub; + const subscriptions = Array(nsubscriptions); + for (i = 0; i < nsubscriptions; i++) { + sub = in_ptr + i * 48; + const userdata = view.getBigUint64(sub, true); + const type = view.getUint8(sub + 8); + const clockIdOrFd = view.getUint32(sub + 16, true); + const timeout = view.getBigUint64(sub + 24, true); + const precision = view.getBigUint64(sub + 32, true); + const flags = view.getUint16(sub + 40, true); + subscriptions[i] = { + userdata, + type, + u: { + clock: { + clock_id: clockIdOrFd, + timeout, + precision, + flags, + }, + fd_readwrite: { + fd: clockIdOrFd, + }, + }, + }; + } + const fdevents = []; + for (i = 0; i < nsubscriptions; i++) { + sub = subscriptions[i]; + switch (sub.type) { + case 0 /* WasiEventType.CLOCK */: { + if (sub.u.clock.flags === 1 /* WasiSubclockflags.ABSTIME */) { + /* Convert absolute time to relative delay. */ + const now = BigInt(Date.now()) * BigInt(1000000); + cur_timeout = sub.u.clock.timeout - now; + } else { + cur_timeout = sub.u.clock.timeout; + } + if (has_timeout === 0 || cur_timeout < min_timeout) { + min_timeout = cur_timeout; + timer_userdata = sub.userdata; + has_timeout = 1; + } + break; + } + case 1 /* WasiEventType.FD_READ */: + case 2 /* WasiEventType.FD_WRITE */: + fdevents.push(sub); + break; + default: + return 28 /* WasiErrno.EINVAL */; + } + } + if (fdevents.length > 0) { + for (i = 0; i < fdevents.length; i++) { + const fdevent = fdevents[i]; + const event = out_ptr + 32 * i; + view.setBigUint64(event, fdevent.userdata, true); + view.setUint32(event + 8, 52 /* WasiErrno.ENOSYS */, true); + view.setUint32(event + 12, fdevent.type, true); + view.setBigUint64(event + 16, BigInt(0), true); + view.setUint16(event + 24, 0, true); + view.setUint32(nevents, 1, true); + } + view.setUint32(nevents, fdevents.length, true); + return 0 /* WasiErrno.ESUCCESS */; + } + if (has_timeout) { + Number(min_timeout / BigInt(1000000)); + // } else { + // const buf = new SharedArrayBuffer(4) + // const arr = new Int32Array(buf) + // postMsg({ + // __tybys_wasm_util_wasi__: { + // type: 'set-timeout', + // payload: { + // buffer: buf, + // delay + // } + // } + // }) + // Atomics.wait(arr, 0, 0) + // } + const event = out_ptr; + view.setBigUint64(event, timer_userdata, true); + view.setUint32(event + 8, 0 /* WasiErrno.ESUCCESS */, true); + view.setUint32(event + 12, 0 /* WasiEventType.CLOCK */, true); + view.setUint32(nevents, 1, true); + } + return 0 /* WasiErrno.ESUCCESS */; + }, + ); + this.proc_exit = syscallWrap(this, 'proc_exit', function (rval) { + return 0 /* WasiErrno.ESUCCESS */; + }); + this.proc_raise = syscallWrap(this, 'proc_raise', function (_sig) { + return 52 /* WasiErrno.ENOSYS */; + }); + this.sched_yield = syscallWrap(this, 'sched_yield', function () { + return 0 /* WasiErrno.ESUCCESS */; + }); + this.random_get = + typeof crypto !== 'undefined' && + typeof crypto.getRandomValues === 'function' + ? syscallWrap(this, 'random_get', function (buf, buf_len) { buf = Number(buf); - buf_len = Number(buf_len); - bufused = Number(bufused); - if (buf === 0 || bufused === 0) - return 0 /* WasiErrno.ESUCCESS */; - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0)); - const fs = getFs(this); - const entries = fs.readdirSync(fileDescriptor.realPath, { withFileTypes: true }); - const { HEAPU8, view } = getMemory(this); - let bufferUsed = 0; - for (let i = Number(cookie); i < entries.length; i++) { - const nameData = encoder.encode(entries[i].name); - const entryInfo = fs.statSync(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true }); - const entryData = new Uint8Array(24 + nameData.byteLength); - const entryView = new DataView(entryData.buffer); - entryView.setBigUint64(0, BigInt(i + 1), true); - entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true); - entryView.setUint32(16, nameData.byteLength, true); - let type; - if (entries[i].isFile()) { - type = 4 /* WasiFileType.REGULAR_FILE */; - } - else if (entries[i].isDirectory()) { - type = 3 /* WasiFileType.DIRECTORY */; - } - else if (entries[i].isSymbolicLink()) { - type = 7 /* WasiFileType.SYMBOLIC_LINK */; - } - else if (entries[i].isCharacterDevice()) { - type = 2 /* WasiFileType.CHARACTER_DEVICE */; - } - else if (entries[i].isBlockDevice()) { - type = 1 /* WasiFileType.BLOCK_DEVICE */; - } - else if (entries[i].isSocket()) { - type = 6 /* WasiFileType.SOCKET_STREAM */; - } - else { - type = 0 /* WasiFileType.UNKNOWN */; - } - entryView.setUint8(20, type); - entryData.set(nameData, 24); - const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed)); - HEAPU8.set(data, buf + bufferUsed); - bufferUsed += data.byteLength; + if (buf === 0) { + return 28 /* WasiErrno.EINVAL */; } - view.setUint32(bufused, bufferUsed, true); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_readdir(fd, buf, buf_len, cookie, bufused) { - buf = Number(buf); buf_len = Number(buf_len); - bufused = Number(bufused); - if (buf === 0 || bufused === 0) - return 0 /* WasiErrno.ESUCCESS */; - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READDIR, BigInt(0)); - const fs = getFs(this); - const entries = await fs.promises.readdir(fileDescriptor.realPath, { withFileTypes: true }); - const { HEAPU8, view } = getMemory(this); - let bufferUsed = 0; - for (let i = Number(cookie); i < entries.length; i++) { - const nameData = encoder.encode(entries[i].name); - const entryInfo = await fs.promises.stat(resolve(fileDescriptor.realPath, entries[i].name), { bigint: true }); - const entryData = new Uint8Array(24 + nameData.byteLength); - const entryView = new DataView(entryData.buffer); - entryView.setBigUint64(0, BigInt(i + 1), true); - entryView.setBigUint64(8, BigInt(entryInfo.ino ? entryInfo.ino : 0), true); - entryView.setUint32(16, nameData.byteLength, true); - let type; - if (entries[i].isFile()) { - type = 4 /* WasiFileType.REGULAR_FILE */; - } - else if (entries[i].isDirectory()) { - type = 3 /* WasiFileType.DIRECTORY */; - } - else if (entries[i].isSymbolicLink()) { - type = 7 /* WasiFileType.SYMBOLIC_LINK */; - } - else if (entries[i].isCharacterDevice()) { - type = 2 /* WasiFileType.CHARACTER_DEVICE */; - } - else if (entries[i].isBlockDevice()) { - type = 1 /* WasiFileType.BLOCK_DEVICE */; - } - else if (entries[i].isSocket()) { - type = 6 /* WasiFileType.SOCKET_STREAM */; - } - else { - type = 0 /* WasiFileType.UNKNOWN */; - } - entryView.setUint8(20, type); - entryData.set(nameData, 24); - const data = entryData.slice(0, Math.min(entryData.length, buf_len - bufferUsed)); - HEAPU8.set(data, buf + bufferUsed); - bufferUsed += data.byteLength; - } - view.setUint32(bufused, bufferUsed, true); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i64', 'i32'], ['i32']); - defineImport('fd_renumber', function fd_renumber(from, to) { - const wasi = _wasi.get(this); - wasi.fds.renumber(to, from); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_renumber(from, to) { - const wasi = _wasi.get(this); - await wasi.fds.renumber(to, from); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32'], ['i32']); - defineImport('fd_sync', function fd_sync(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); - const fs = getFs(this); - fs.fsyncSync(fileDescriptor.fd); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_sync(fd) { - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); - await fileDescriptor.fd.sync(); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32'], ['i32']); - defineImport('fd_write', function fd_write(fd, iovs, iovslen, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - return HEAPU8.subarray(buf, buf + bufLen); - })); - let nwritten; - if (fd === 1 || fd === 2) { - nwritten = fileDescriptor.write(buffer); - } - else { - const fs = getFs(this); - nwritten = fs.writeSync(fileDescriptor.fd, buffer, 0, buffer.length, Number(fileDescriptor.pos)); - fileDescriptor.pos += BigInt(nwritten); - } - view.setUint32(size, nwritten, true); - return 0 /* WasiErrno.ESUCCESS */; - }, async function fd_write(fd, iovs, iovslen, size) { - iovs = Number(iovs); - size = Number(size); - if ((iovs === 0 && iovslen) || size === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); - if (!iovslen) { - view.setUint32(size, 0, true); - return 0 /* WasiErrno.ESUCCESS */; - } - const buffer = concatBuffer(Array.from({ length: Number(iovslen) }, (_, i) => { - const offset = iovs + (i * 8); - const buf = view.getInt32(offset, true); - const bufLen = view.getUint32(offset + 4, true); - return HEAPU8.subarray(buf, buf + bufLen); - })); - let nwritten; - if (fd === 1 || fd === 2) { - nwritten = fileDescriptor.write(buffer); - } - else { - nwritten = await (await (fileDescriptor.fd.write(buffer, 0, buffer.length, Number(fileDescriptor.pos)))).bytesWritten; - fileDescriptor.pos += BigInt(nwritten); - } - view.setUint32(size, nwritten, true); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('path_create_directory', function path_create_directory(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - fs.mkdirSync(pathString); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_create_directory(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_CREATE_DIRECTORY, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - await fs.promises.mkdir(pathString); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32'], ['i32']); - defineImport('path_filestat_get', function path_filestat_get(fd, flags, path, path_len, filestat) { - path = Number(path); - path_len = Number(path_len); - filestat = Number(filestat); - if (path === 0 || filestat === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - const fs = getFs(this); - pathString = resolve(fileDescriptor.realPath, pathString); - let stat; - if ((flags & 1) === 1) { - stat = fs.statSync(pathString, { bigint: true }); - } - else { - stat = fs.lstatSync(pathString, { bigint: true }); - } - toFileStat(view, filestat, stat); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_filestat_get(fd, flags, path, path_len, filestat) { - path = Number(path); - path_len = Number(path_len); - filestat = Number(filestat); - if (path === 0 || filestat === 0) { - return 28 /* WasiErrno.EINVAL */; - } const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_GET, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - const fs = getFs(this); - pathString = resolve(fileDescriptor.realPath, pathString); - let stat; - if ((flags & 1) === 1) { - stat = await fs.promises.stat(pathString, { bigint: true }); - } - else { - stat = await fs.promises.lstat(pathString, { bigint: true }); - } - toFileStat(view, filestat, stat); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('path_filestat_set_times', function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) - return 28 /* WasiErrno.EINVAL */; - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0)); - if (validateFstFlagsOrReturn(fst_flags)) { - return 28 /* WasiErrno.EINVAL */; - } - const fs = getFs(this); - const resolvedPath = resolvePathSync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags); - if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { - atim = BigInt(Date.now() * 1000000); - } - if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { - mtim = BigInt(Date.now() * 1000000); - } - fs.utimesSync(resolvedPath, Number(atim), Number(mtim)); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_filestat_set_times(fd, flags, path, path_len, atim, mtim, fst_flags) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) - return 28 /* WasiErrno.EINVAL */; - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_FILESTAT_SET_TIMES, BigInt(0)); - if (validateFstFlagsOrReturn(fst_flags)) { - return 28 /* WasiErrno.EINVAL */; - } - const fs = getFs(this); - const resolvedPath = await resolvePathAsync(fs, fileDescriptor, decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), flags); - if ((fst_flags & 2 /* WasiFstFlag.SET_ATIM_NOW */) === 2 /* WasiFstFlag.SET_ATIM_NOW */) { - atim = BigInt(Date.now() * 1000000); - } - if ((fst_flags & 8 /* WasiFstFlag.SET_MTIM_NOW */) === 8 /* WasiFstFlag.SET_MTIM_NOW */) { - mtim = BigInt(Date.now() * 1000000); - } - await fs.promises.utimes(resolvedPath, Number(atim), Number(mtim)); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32'], ['i32']); - defineImport('path_link', function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - let oldWrap; - let newWrap; - if (old_fd === new_fd) { - oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0)); - } - else { - oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0)); - newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0)); - } - const { HEAPU8 } = getMemory(this); - const fs = getFs(this); - const resolvedOldPath = resolvePathSync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags); - const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); - fs.linkSync(resolvedOldPath, resolvedNewPath); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_link(old_fd, old_flags, old_path, old_path_len, new_fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - let oldWrap; - let newWrap; - if (old_fd === new_fd) { - oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, BigInt(0)); - } - else { - oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_LINK_SOURCE, BigInt(0)); - newWrap = wasi.fds.get(new_fd, WasiRights.PATH_LINK_TARGET, BigInt(0)); - } - const { HEAPU8 } = getMemory(this); - const fs = getFs(this); - const resolvedOldPath = await resolvePathAsync(fs, oldWrap, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)), old_flags); - const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); - await fs.promises.link(resolvedOldPath, resolvedNewPath); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); - function pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags) { - const read = (fs_rights_base & (WasiRights.FD_READ | - WasiRights.FD_READDIR)) !== BigInt(0); - const write = (fs_rights_base & (WasiRights.FD_DATASYNC | - WasiRights.FD_WRITE | - WasiRights.FD_ALLOCATE | - WasiRights.FD_FILESTAT_SET_SIZE)) !== BigInt(0); - let flags = write ? read ? 2 /* FileControlFlag.O_RDWR */ : 1 /* FileControlFlag.O_WRONLY */ : 0 /* FileControlFlag.O_RDONLY */; - let needed_base = WasiRights.PATH_OPEN; - let needed_inheriting = fs_rights_base | fs_rights_inheriting; - if ((o_flags & 1 /* WasiFileControlFlag.O_CREAT */) !== 0) { - flags |= 64 /* FileControlFlag.O_CREAT */; - needed_base |= WasiRights.PATH_CREATE_FILE; - } - if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0) { - flags |= 65536 /* FileControlFlag.O_DIRECTORY */; - } - if ((o_flags & 4 /* WasiFileControlFlag.O_EXCL */) !== 0) { - flags |= 128 /* FileControlFlag.O_EXCL */; - } - if ((o_flags & 8 /* WasiFileControlFlag.O_TRUNC */) !== 0) { - flags |= 512 /* FileControlFlag.O_TRUNC */; - needed_base |= WasiRights.PATH_FILESTAT_SET_SIZE; - } - if ((fs_flags & 1 /* WasiFdFlag.APPEND */) !== 0) { - flags |= 1024 /* FileControlFlag.O_APPEND */; - } - if ((fs_flags & 2 /* WasiFdFlag.DSYNC */) !== 0) { - // flags |= FileControlFlag.O_DSYNC; - needed_inheriting |= WasiRights.FD_DATASYNC; - } - if ((fs_flags & 4 /* WasiFdFlag.NONBLOCK */) !== 0) { - flags |= 2048 /* FileControlFlag.O_NONBLOCK */; - } - if ((fs_flags & 8 /* WasiFdFlag.RSYNC */) !== 0) { - flags |= 1052672 /* FileControlFlag.O_SYNC */; - needed_inheriting |= WasiRights.FD_SYNC; - } - if ((fs_flags & 16 /* WasiFdFlag.SYNC */) !== 0) { - flags |= 1052672 /* FileControlFlag.O_SYNC */; - needed_inheriting |= WasiRights.FD_SYNC; - } - if (write && (flags & (1024 /* FileControlFlag.O_APPEND */ | 512 /* FileControlFlag.O_TRUNC */)) === 0) { - needed_inheriting |= WasiRights.FD_SEEK; - } - return { flags, needed_base, needed_inheriting }; - } - defineImport('path_open', function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { - path = Number(path); - fd = Number(fd); - if (path === 0 || fd === 0) { - return 28 /* WasiErrno.EINVAL */; - } - path_len = Number(path_len); - fs_rights_base = BigInt(fs_rights_base); - fs_rights_inheriting = BigInt(fs_rights_inheriting); - const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting); - const memory = getMemory(this); - const HEAPU8 = memory.HEAPU8; - const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - const fs = getFs(this); - const resolved_path = resolvePathSync(fs, fileDescriptor, pathString, dirflags); - const r = fs.openSync(resolved_path, flagsRes, 0o666); - const filetype = wasi.fds.getFileTypeByFd(r); - if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) { - return 54 /* WasiErrno.ENOTDIR */; - } - const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r, flagsRes, filetype); - const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0); - const stat = fs.fstatSync(r, { bigint: true }); - if (stat.isFile()) { - wrap.size = stat.size; - if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) { - wrap.pos = stat.size; - } - } - const view = memory.view; - view.setInt32(fd, wrap.id, true); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_open(dirfd, dirflags, path, path_len, o_flags, fs_rights_base, fs_rights_inheriting, fs_flags, fd) { - path = Number(path); - fd = Number(fd); - if (path === 0 || fd === 0) { - return 28 /* WasiErrno.EINVAL */; - } - path_len = Number(path_len); - fs_rights_base = BigInt(fs_rights_base); - fs_rights_inheriting = BigInt(fs_rights_inheriting); - const { flags: flagsRes, needed_base: neededBase, needed_inheriting: neededInheriting } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(dirfd, neededBase, neededInheriting); - const memory = getMemory(this); - const HEAPU8 = memory.HEAPU8; - const pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - const fs = getFs(this); - const resolved_path = await resolvePathAsync(fs, fileDescriptor, pathString, dirflags); - const r = await fs.promises.open(resolved_path, flagsRes, 0o666); - const filetype = await wasi.fds.getFileTypeByFd(r); - if ((o_flags & 2 /* WasiFileControlFlag.O_DIRECTORY */) !== 0 && filetype !== 3 /* WasiFileType.DIRECTORY */) { - return 54 /* WasiErrno.ENOTDIR */; - } - const { base: max_base, inheriting: max_inheriting } = getRights(wasi.fds.stdio, r.fd, flagsRes, filetype); - const wrap = wasi.fds.insert(r, resolved_path, resolved_path, filetype, fs_rights_base & max_base, fs_rights_inheriting & max_inheriting, 0); - const stat = await r.stat({ bigint: true }); - if (stat.isFile()) { - wrap.size = stat.size; - if ((flagsRes & 1024 /* FileControlFlag.O_APPEND */) !== 0) { - wrap.pos = stat.size; - } - } - const view = memory.view; - view.setInt32(fd, wrap.id, true); + if ( + (typeof SharedArrayBuffer === 'function' && + HEAPU8.buffer instanceof SharedArrayBuffer) || + Object.prototype.toString.call(HEAPU8.buffer) === + '[object SharedArrayBuffer]' + ) { + for (let i = buf; i < buf + buf_len; ++i) { + view.setUint8(i, Math.floor(Math.random() * 256)); + } + return 0 /* WasiErrno.ESUCCESS */; + } + let pos; + const stride = 65536; + for (pos = 0; pos + stride < buf_len; pos += stride) { + crypto.getRandomValues( + HEAPU8.subarray(buf + pos, buf + pos + stride), + ); + } + crypto.getRandomValues(HEAPU8.subarray(buf + pos, buf + buf_len)); return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32', 'i32'], ['i32']); - defineImport('path_readlink', function path_readlink(fd, path, path_len, buf, buf_len, bufused) { - path = Number(path); - path_len = Number(path_len); + }) + : syscallWrap(this, 'random_get', function (buf, buf_len) { buf = Number(buf); - buf_len = Number(buf_len); - bufused = Number(bufused); - if (path === 0 || buf === 0 || bufused === 0) { - return 28 /* WasiErrno.EINVAL */; + if (buf === 0) { + return 28 /* WasiErrno.EINVAL */; } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - const link = fs.readlinkSync(pathString); - const linkData = encoder.encode(link); - const len = Math.min(linkData.length, buf_len); - if (len >= buf_len) - return 42 /* WasiErrno.ENOBUFS */; - HEAPU8.set(linkData.subarray(0, len), buf); - HEAPU8[buf + len] = 0; - view.setUint32(bufused, len, true); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_readlink(fd, path, path_len, buf, buf_len, bufused) { - path = Number(path); - path_len = Number(path_len); - buf = Number(buf); buf_len = Number(buf_len); - bufused = Number(bufused); - if (path === 0 || buf === 0 || bufused === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8, view } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_READLINK, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - const link = await fs.promises.readlink(pathString); - const linkData = encoder.encode(link); - const len = Math.min(linkData.length, buf_len); - if (len >= buf_len) - return 42 /* WasiErrno.ENOBUFS */; - HEAPU8.set(linkData.subarray(0, len), buf); - HEAPU8[buf + len] = 0; - view.setUint32(bufused, len, true); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('path_remove_directory', function path_remove_directory(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - fs.rmdirSync(pathString); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_remove_directory(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_REMOVE_DIRECTORY, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - await fs.promises.rmdir(pathString); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32'], ['i32']); - defineImport('path_rename', function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - let oldWrap; - let newWrap; - if (old_fd === new_fd) { - oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0)); - } - else { - oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0)); - newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0)); - } - const { HEAPU8 } = getMemory(this); - const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len))); - const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); - const fs = getFs(this); - fs.renameSync(resolvedOldPath, resolvedNewPath); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_rename(old_fd, old_path, old_path_len, new_fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const wasi = _wasi.get(this); - let oldWrap; - let newWrap; - if (old_fd === new_fd) { - oldWrap = newWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, BigInt(0)); - } - else { - oldWrap = wasi.fds.get(old_fd, WasiRights.PATH_RENAME_SOURCE, BigInt(0)); - newWrap = wasi.fds.get(new_fd, WasiRights.PATH_RENAME_TARGET, BigInt(0)); - } - const { HEAPU8 } = getMemory(this); - const resolvedOldPath = resolve(oldWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len))); - const resolvedNewPath = resolve(newWrap.realPath, decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len))); - const fs = getFs(this); - await fs.promises.rename(resolvedOldPath, resolvedNewPath); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('path_symlink', function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0)); - const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)); - let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)); - newPath = resolve(fileDescriptor.realPath, newPath); - const fs = getFs(this); - fs.symlinkSync(oldPath, newPath); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_symlink(old_path, old_path_len, fd, new_path, new_path_len) { - old_path = Number(old_path); - old_path_len = Number(old_path_len); - new_path = Number(new_path); - new_path_len = Number(new_path_len); - if (old_path === 0 || new_path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_SYMLINK, BigInt(0)); - const oldPath = decoder.decode(unsharedSlice(HEAPU8, old_path, old_path + old_path_len)); - let newPath = decoder.decode(unsharedSlice(HEAPU8, new_path, new_path + new_path_len)); - newPath = resolve(fileDescriptor.realPath, newPath); - const fs = getFs(this); - await fs.promises.symlink(oldPath, newPath); - return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32', 'i32', 'i32'], ['i32']); - defineImport('path_unlink_file', function path_unlink_file(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; - } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - fs.unlinkSync(pathString); - return 0 /* WasiErrno.ESUCCESS */; - }, async function path_unlink_file(fd, path, path_len) { - path = Number(path); - path_len = Number(path_len); - if (path === 0) { - return 28 /* WasiErrno.EINVAL */; + const { view } = getMemory(this); + for (let i = buf; i < buf + buf_len; ++i) { + view.setUint8(i, Math.floor(Math.random() * 256)); } - const { HEAPU8 } = getMemory(this); - const wasi = _wasi.get(this); - const fileDescriptor = wasi.fds.get(fd, WasiRights.PATH_UNLINK_FILE, BigInt(0)); - let pathString = decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)); - pathString = resolve(fileDescriptor.realPath, pathString); - const fs = getFs(this); - await fs.promises.unlink(pathString); return 0 /* WasiErrno.ESUCCESS */; - }, ['i32', 'i32', 'i32'], ['i32']); - this._setMemory = function setMemory(m) { - if (!(m instanceof _WebAssembly.Memory)) { - throw new TypeError('"instance.exports.memory" property must be a WebAssembly.Memory'); - } - _memory.set(_this, extendMemory(m)); - }; + }); + this.sock_recv = syscallWrap(this, 'sock_recv', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_send = syscallWrap(this, 'sock_send', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_shutdown = syscallWrap(this, 'sock_shutdown', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + this.sock_accept = syscallWrap(this, 'sock_accept', function () { + return 58 /* WasiErrno.ENOTSUP */; + }); + _wasi.set(this, { + fds, + args, + env, + }); + if (fs) _fs.set(this, fs); + // eslint-disable-next-line @typescript-eslint/no-this-alias + const _this = this; + function defineImport( + name, + syncVersion, + asyncVersion, + parameterType, + returnType, + ) { + if (asyncFs) { + if (asyncify) { + _this[name] = asyncify.wrapImportFunction( + syscallWrap(_this, name, asyncVersion), + ); + } else { + _this[name] = wrapAsyncImport( + syscallWrap(_this, name, asyncVersion), + parameterType, + returnType, + ); + } + } else { + _this[name] = syscallWrap(_this, name, syncVersion); + } } - static createSync(args, env, preopens, stdio, fs, print, printErr) { - const fds = new SyncTable({ - size: 3, - in: stdio[0], - out: stdio[1], - err: stdio[2], - fs, - print, - printErr - }); - const _this = new WASI$1(args, env, fds, false, fs); - if (preopens.length > 0) { - for (let i = 0; i < preopens.length; ++i) { - const realPath = fs.realpathSync(preopens[i].realPath, 'utf8'); - const fd = fs.openSync(realPath, 'r', 0o666); - fds.insertPreopen(fd, preopens[i].mappedPath, realPath); - } - } - return _this; + defineImport( + 'fd_allocate', + function fd_allocate(fd, offset, len) { + const wasi = _wasi.get(this); + const fs = getFs(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_ALLOCATE, + BigInt(0), + ); + const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); + if (stat.size < offset + len) { + fs.ftruncateSync(fileDescriptor.fd, Number(offset + len)); + } + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_allocate(fd, offset, len) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_ALLOCATE, + BigInt(0), + ); + const h = fileDescriptor.fd; + const stat = await h.stat({ bigint: true }); + if (stat.size < offset + len) { + await h.truncate(Number(offset + len)); + } + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i64', 'f64'], + ['i32'], + ); + defineImport( + 'fd_close', + function fd_close(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + const fs = getFs(this); + fs.closeSync(fileDescriptor.fd); + wasi.fds.remove(fd); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_close(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, BigInt(0), BigInt(0)); + await fileDescriptor.fd.close(); + wasi.fds.remove(fd); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32'], + ['i32'], + ); + defineImport( + 'fd_datasync', + function fd_datasync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_DATASYNC, + BigInt(0), + ); + const fs = getFs(this); + fs.fdatasyncSync(fileDescriptor.fd); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_datasync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_DATASYNC, + BigInt(0), + ); + await fileDescriptor.fd.datasync(); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32'], + ['i32'], + ); + defineImport( + 'fd_filestat_get', + function fd_filestat_get(fd, buf) { + buf = Number(buf); + if (buf === 0) return 28 /* WasiErrno.EINVAL */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_FILESTAT_GET, + BigInt(0), + ); + const fs = getFs(this); + const stat = fs.fstatSync(fileDescriptor.fd, { bigint: true }); + const { view } = getMemory(this); + toFileStat(view, buf, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_filestat_get(fd, buf) { + buf = Number(buf); + if (buf === 0) return 28 /* WasiErrno.EINVAL */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_FILESTAT_GET, + BigInt(0), + ); + const h = fileDescriptor.fd; + const stat = await h.stat({ bigint: true }); + const { view } = getMemory(this); + toFileStat(view, buf, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32'], + ['i32'], + ); + defineImport( + 'fd_filestat_set_size', + function fd_filestat_set_size(fd, size) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_FILESTAT_SET_SIZE, + BigInt(0), + ); + const fs = getFs(this); + fs.ftruncateSync(fileDescriptor.fd, Number(size)); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_filestat_set_size(fd, size) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_FILESTAT_SET_SIZE, + BigInt(0), + ); + const h = fileDescriptor.fd; + await h.truncate(Number(size)); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i64'], + ['i32'], + ); + function fdFilestatGetTimes(fd, atim, mtim, flags) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_FILESTAT_SET_TIMES, + BigInt(0), + ); + if ( + (flags & 2) /* WasiFstFlag.SET_ATIM_NOW */ === + 2 /* WasiFstFlag.SET_ATIM_NOW */ + ) { + atim = BigInt(Date.now() * 1000000); + } + if ( + (flags & 8) /* WasiFstFlag.SET_MTIM_NOW */ === + 8 /* WasiFstFlag.SET_MTIM_NOW */ + ) { + mtim = BigInt(Date.now() * 1000000); + } + return { fileDescriptor, atim, mtim }; } - static async createAsync(args, env, preopens, stdio, fs, print, printErr, asyncify) { - const fds = new AsyncTable({ - size: 3, - in: stdio[0], - out: stdio[1], - err: stdio[2], - print, - printErr + defineImport( + 'fd_filestat_set_times', + function fd_filestat_set_times(fd, atim, mtim, flags) { + if (validateFstFlagsOrReturn(flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const { + fileDescriptor, + atim: atimRes, + mtim: mtimRes, + } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); + const fs = getFs(this); + fs.futimesSync(fileDescriptor.fd, Number(atimRes), Number(mtimRes)); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_filestat_set_times(fd, atim, mtim, flags) { + if (validateFstFlagsOrReturn(flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const { + fileDescriptor, + atim: atimRes, + mtim: mtimRes, + } = fdFilestatGetTimes.call(this, fd, atim, mtim, flags); + const h = fileDescriptor.fd; + await h.utimes(Number(atimRes), Number(mtimRes)); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i64', 'i64', 'i32'], + ['i32'], + ); + defineImport( + 'fd_pread', + function fd_pread(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_READ | WasiRights.FD_SEEK, + BigInt(0), + ); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); }); - const _this = new WASI$1(args, env, fds, true, fs, asyncify); - if (preopens.length > 0) { - for (let i = 0; i < preopens.length; ++i) { - const entry = preopens[i]; - const realPath = await fs.promises.realpath(entry.realPath); - const fd = await fs.promises.open(realPath, 'r', 0o666); - await fds.insertPreopen(fd, entry.mappedPath, realPath); - } - } - return _this; + let nread = 0; + const buffer = (() => { + try { + return new Uint8Array(new SharedArrayBuffer(totalSize)); + } catch (_) { + return new Uint8Array(totalSize); + } + })(); + buffer._isBuffer = true; + const fs = getFs(this); + const bytesRead = fs.readSync( + fileDescriptor.fd, + buffer, + 0, + buffer.length, + Number(offset), + ); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function (fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_READ | WasiRights.FD_SEEK, + BigInt(0), + ); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let nread = 0; + const buffer = new Uint8Array(totalSize); + buffer._isBuffer = true; + const { bytesRead } = await fileDescriptor.fd.read( + buffer, + 0, + buffer.length, + Number(offset), + ); + nread = buffer ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) : 0; + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i64', 'i32'], + ['i32'], + ); + defineImport( + 'fd_pwrite', + function fd_pwrite(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_WRITE | WasiRights.FD_SEEK, + BigInt(0), + ); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer( + Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + }), + ); + const fs = getFs(this); + const nwritten = fs.writeSync( + fileDescriptor.fd, + buffer, + 0, + buffer.length, + Number(offset), + ); + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_pwrite(fd, iovs, iovslen, offset, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0 || offset > INT64_MAX) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_WRITE | WasiRights.FD_SEEK, + BigInt(0), + ); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer( + Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + }), + ); + const { bytesWritten } = await fileDescriptor.fd.write( + buffer, + 0, + buffer.length, + Number(offset), + ); + view.setUint32(size, bytesWritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i64', 'i32'], + ['i32'], + ); + defineImport( + 'fd_read', + function fd_read(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let buffer; + let nread = 0; + if (fd === 0) { + if ( + typeof window === 'undefined' || + typeof window.prompt !== 'function' + ) { + return 58 /* WasiErrno.ENOTSUP */; + } + buffer = readStdin(); + nread = buffer ? copyMemory(ioVecs, buffer) : 0; + } else { + buffer = (() => { + try { + return new Uint8Array(new SharedArrayBuffer(totalSize)); + } catch (_) { + return new Uint8Array(totalSize); + } + })(); + buffer._isBuffer = true; + const fs = getFs(this); + const bytesRead = fs.readSync( + fileDescriptor.fd, + buffer, + 0, + buffer.length, + Number(fileDescriptor.pos), + ); + nread = buffer + ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) + : 0; + fileDescriptor.pos += BigInt(nread); + } + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_read(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_READ, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + let totalSize = 0; + const ioVecs = Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + totalSize += bufLen; + return HEAPU8.subarray(buf, buf + bufLen); + }); + let buffer; + let nread = 0; + if (fd === 0) { + if ( + typeof window === 'undefined' || + typeof window.prompt !== 'function' + ) { + return 58 /* WasiErrno.ENOTSUP */; + } + buffer = readStdin(); + nread = buffer ? copyMemory(ioVecs, buffer) : 0; + } else { + buffer = new Uint8Array(totalSize); + buffer._isBuffer = true; + const { bytesRead } = await fileDescriptor.fd.read( + buffer, + 0, + buffer.length, + Number(fileDescriptor.pos), + ); + nread = buffer + ? copyMemory(ioVecs, buffer.subarray(0, bytesRead)) + : 0; + fileDescriptor.pos += BigInt(nread); + } + view.setUint32(size, nread, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'fd_readdir', + function fd_readdir(fd, buf, buf_len, cookie, bufused) { + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (buf === 0 || bufused === 0) return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_READDIR, + BigInt(0), + ); + const fs = getFs(this); + const entries = fs.readdirSync(fileDescriptor.realPath, { + withFileTypes: true, + }); + const { HEAPU8, view } = getMemory(this); + let bufferUsed = 0; + for (let i = Number(cookie); i < entries.length; i++) { + const nameData = encoder.encode(entries[i].name); + const entryInfo = fs.statSync( + resolve(fileDescriptor.realPath, entries[i].name), + { bigint: true }, + ); + const entryData = new Uint8Array(24 + nameData.byteLength); + const entryView = new DataView(entryData.buffer); + entryView.setBigUint64(0, BigInt(i + 1), true); + entryView.setBigUint64( + 8, + BigInt(entryInfo.ino ? entryInfo.ino : 0), + true, + ); + entryView.setUint32(16, nameData.byteLength, true); + let type; + if (entries[i].isFile()) { + type = 4 /* WasiFileType.REGULAR_FILE */; + } else if (entries[i].isDirectory()) { + type = 3 /* WasiFileType.DIRECTORY */; + } else if (entries[i].isSymbolicLink()) { + type = 7 /* WasiFileType.SYMBOLIC_LINK */; + } else if (entries[i].isCharacterDevice()) { + type = 2 /* WasiFileType.CHARACTER_DEVICE */; + } else if (entries[i].isBlockDevice()) { + type = 1 /* WasiFileType.BLOCK_DEVICE */; + } else if (entries[i].isSocket()) { + type = 6 /* WasiFileType.SOCKET_STREAM */; + } else { + type = 0 /* WasiFileType.UNKNOWN */; + } + entryView.setUint8(20, type); + entryData.set(nameData, 24); + const data = entryData.slice( + 0, + Math.min(entryData.length, buf_len - bufferUsed), + ); + HEAPU8.set(data, buf + bufferUsed); + bufferUsed += data.byteLength; + } + view.setUint32(bufused, bufferUsed, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_readdir(fd, buf, buf_len, cookie, bufused) { + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (buf === 0 || bufused === 0) return 0 /* WasiErrno.ESUCCESS */; + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.FD_READDIR, + BigInt(0), + ); + const fs = getFs(this); + const entries = await fs.promises.readdir(fileDescriptor.realPath, { + withFileTypes: true, + }); + const { HEAPU8, view } = getMemory(this); + let bufferUsed = 0; + for (let i = Number(cookie); i < entries.length; i++) { + const nameData = encoder.encode(entries[i].name); + const entryInfo = await fs.promises.stat( + resolve(fileDescriptor.realPath, entries[i].name), + { bigint: true }, + ); + const entryData = new Uint8Array(24 + nameData.byteLength); + const entryView = new DataView(entryData.buffer); + entryView.setBigUint64(0, BigInt(i + 1), true); + entryView.setBigUint64( + 8, + BigInt(entryInfo.ino ? entryInfo.ino : 0), + true, + ); + entryView.setUint32(16, nameData.byteLength, true); + let type; + if (entries[i].isFile()) { + type = 4 /* WasiFileType.REGULAR_FILE */; + } else if (entries[i].isDirectory()) { + type = 3 /* WasiFileType.DIRECTORY */; + } else if (entries[i].isSymbolicLink()) { + type = 7 /* WasiFileType.SYMBOLIC_LINK */; + } else if (entries[i].isCharacterDevice()) { + type = 2 /* WasiFileType.CHARACTER_DEVICE */; + } else if (entries[i].isBlockDevice()) { + type = 1 /* WasiFileType.BLOCK_DEVICE */; + } else if (entries[i].isSocket()) { + type = 6 /* WasiFileType.SOCKET_STREAM */; + } else { + type = 0 /* WasiFileType.UNKNOWN */; + } + entryView.setUint8(20, type); + entryData.set(nameData, 24); + const data = entryData.slice( + 0, + Math.min(entryData.length, buf_len - bufferUsed), + ); + HEAPU8.set(data, buf + bufferUsed); + bufferUsed += data.byteLength; + } + view.setUint32(bufused, bufferUsed, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i64', 'i32'], + ['i32'], + ); + defineImport( + 'fd_renumber', + function fd_renumber(from, to) { + const wasi = _wasi.get(this); + wasi.fds.renumber(to, from); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_renumber(from, to) { + const wasi = _wasi.get(this); + await wasi.fds.renumber(to, from); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32'], + ['i32'], + ); + defineImport( + 'fd_sync', + function fd_sync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); + const fs = getFs(this); + fs.fsyncSync(fileDescriptor.fd); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_sync(fd) { + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_SYNC, BigInt(0)); + await fileDescriptor.fd.sync(); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32'], + ['i32'], + ); + defineImport( + 'fd_write', + function fd_write(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer( + Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + }), + ); + let nwritten; + if (fd === 1 || fd === 2) { + nwritten = fileDescriptor.write(buffer); + } else { + const fs = getFs(this); + nwritten = fs.writeSync( + fileDescriptor.fd, + buffer, + 0, + buffer.length, + Number(fileDescriptor.pos), + ); + fileDescriptor.pos += BigInt(nwritten); + } + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function fd_write(fd, iovs, iovslen, size) { + iovs = Number(iovs); + size = Number(size); + if ((iovs === 0 && iovslen) || size === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get(fd, WasiRights.FD_WRITE, BigInt(0)); + if (!iovslen) { + view.setUint32(size, 0, true); + return 0 /* WasiErrno.ESUCCESS */; + } + const buffer = concatBuffer( + Array.from({ length: Number(iovslen) }, (_, i) => { + const offset = iovs + i * 8; + const buf = view.getInt32(offset, true); + const bufLen = view.getUint32(offset + 4, true); + return HEAPU8.subarray(buf, buf + bufLen); + }), + ); + let nwritten; + if (fd === 1 || fd === 2) { + nwritten = fileDescriptor.write(buffer); + } else { + nwritten = await ( + await fileDescriptor.fd.write( + buffer, + 0, + buffer.length, + Number(fileDescriptor.pos), + ) + ).bytesWritten; + fileDescriptor.pos += BigInt(nwritten); + } + view.setUint32(size, nwritten, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_create_directory', + function path_create_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_CREATE_DIRECTORY, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.mkdirSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_create_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_CREATE_DIRECTORY, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.mkdir(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_filestat_get', + function path_filestat_get(fd, flags, path, path_len, filestat) { + path = Number(path); + path_len = Number(path_len); + filestat = Number(filestat); + if (path === 0 || filestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_FILESTAT_GET, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + const fs = getFs(this); + pathString = resolve(fileDescriptor.realPath, pathString); + let stat; + if ((flags & 1) === 1) { + stat = fs.statSync(pathString, { bigint: true }); + } else { + stat = fs.lstatSync(pathString, { bigint: true }); + } + toFileStat(view, filestat, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_filestat_get(fd, flags, path, path_len, filestat) { + path = Number(path); + path_len = Number(path_len); + filestat = Number(filestat); + if (path === 0 || filestat === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_FILESTAT_GET, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + const fs = getFs(this); + pathString = resolve(fileDescriptor.realPath, pathString); + let stat; + if ((flags & 1) === 1) { + stat = await fs.promises.stat(pathString, { bigint: true }); + } else { + stat = await fs.promises.lstat(pathString, { bigint: true }); + } + toFileStat(view, filestat, stat); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_filestat_set_times', + function path_filestat_set_times( + fd, + flags, + path, + path_len, + atim, + mtim, + fst_flags, + ) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) return 28 /* WasiErrno.EINVAL */; + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_FILESTAT_SET_TIMES, + BigInt(0), + ); + if (validateFstFlagsOrReturn(fst_flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const fs = getFs(this); + const resolvedPath = resolvePathSync( + fs, + fileDescriptor, + decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), + flags, + ); + if ( + (fst_flags & 2) /* WasiFstFlag.SET_ATIM_NOW */ === + 2 /* WasiFstFlag.SET_ATIM_NOW */ + ) { + atim = BigInt(Date.now() * 1000000); + } + if ( + (fst_flags & 8) /* WasiFstFlag.SET_MTIM_NOW */ === + 8 /* WasiFstFlag.SET_MTIM_NOW */ + ) { + mtim = BigInt(Date.now() * 1000000); + } + fs.utimesSync(resolvedPath, Number(atim), Number(mtim)); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_filestat_set_times( + fd, + flags, + path, + path_len, + atim, + mtim, + fst_flags, + ) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) return 28 /* WasiErrno.EINVAL */; + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_FILESTAT_SET_TIMES, + BigInt(0), + ); + if (validateFstFlagsOrReturn(fst_flags)) { + return 28 /* WasiErrno.EINVAL */; + } + const fs = getFs(this); + const resolvedPath = await resolvePathAsync( + fs, + fileDescriptor, + decoder.decode(unsharedSlice(HEAPU8, path, path + path_len)), + flags, + ); + if ( + (fst_flags & 2) /* WasiFstFlag.SET_ATIM_NOW */ === + 2 /* WasiFstFlag.SET_ATIM_NOW */ + ) { + atim = BigInt(Date.now() * 1000000); + } + if ( + (fst_flags & 8) /* WasiFstFlag.SET_MTIM_NOW */ === + 8 /* WasiFstFlag.SET_MTIM_NOW */ + ) { + mtim = BigInt(Date.now() * 1000000); + } + await fs.promises.utimes(resolvedPath, Number(atim), Number(mtim)); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32'], + ['i32'], + ); + defineImport( + 'path_link', + function path_link( + old_fd, + old_flags, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, + BigInt(0), + ); + } else { + oldWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_LINK_SOURCE, + BigInt(0), + ); + newWrap = wasi.fds.get( + new_fd, + WasiRights.PATH_LINK_TARGET, + BigInt(0), + ); + } + const { HEAPU8 } = getMemory(this); + const fs = getFs(this); + const resolvedOldPath = resolvePathSync( + fs, + oldWrap, + decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ), + old_flags, + ); + const resolvedNewPath = resolve( + newWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ), + ); + fs.linkSync(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_link( + old_fd, + old_flags, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_LINK_SOURCE | WasiRights.PATH_LINK_TARGET, + BigInt(0), + ); + } else { + oldWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_LINK_SOURCE, + BigInt(0), + ); + newWrap = wasi.fds.get( + new_fd, + WasiRights.PATH_LINK_TARGET, + BigInt(0), + ); + } + const { HEAPU8 } = getMemory(this); + const fs = getFs(this); + const resolvedOldPath = await resolvePathAsync( + fs, + oldWrap, + decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ), + old_flags, + ); + const resolvedNewPath = resolve( + newWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ), + ); + await fs.promises.link(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + function pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags) { + const read = + (fs_rights_base & (WasiRights.FD_READ | WasiRights.FD_READDIR)) !== + BigInt(0); + const write = + (fs_rights_base & + (WasiRights.FD_DATASYNC | + WasiRights.FD_WRITE | + WasiRights.FD_ALLOCATE | + WasiRights.FD_FILESTAT_SET_SIZE)) !== + BigInt(0); + let flags = write + ? read + ? 2 /* FileControlFlag.O_RDWR */ + : 1 /* FileControlFlag.O_WRONLY */ + : 0; /* FileControlFlag.O_RDONLY */ + let needed_base = WasiRights.PATH_OPEN; + let needed_inheriting = fs_rights_base | fs_rights_inheriting; + if ((o_flags & 1) /* WasiFileControlFlag.O_CREAT */ !== 0) { + flags |= 64 /* FileControlFlag.O_CREAT */; + needed_base |= WasiRights.PATH_CREATE_FILE; + } + if ((o_flags & 2) /* WasiFileControlFlag.O_DIRECTORY */ !== 0) { + flags |= 65536 /* FileControlFlag.O_DIRECTORY */; + } + if ((o_flags & 4) /* WasiFileControlFlag.O_EXCL */ !== 0) { + flags |= 128 /* FileControlFlag.O_EXCL */; + } + if ((o_flags & 8) /* WasiFileControlFlag.O_TRUNC */ !== 0) { + flags |= 512 /* FileControlFlag.O_TRUNC */; + needed_base |= WasiRights.PATH_FILESTAT_SET_SIZE; + } + if ((fs_flags & 1) /* WasiFdFlag.APPEND */ !== 0) { + flags |= 1024 /* FileControlFlag.O_APPEND */; + } + if ((fs_flags & 2) /* WasiFdFlag.DSYNC */ !== 0) { + // flags |= FileControlFlag.O_DSYNC; + needed_inheriting |= WasiRights.FD_DATASYNC; + } + if ((fs_flags & 4) /* WasiFdFlag.NONBLOCK */ !== 0) { + flags |= 2048 /* FileControlFlag.O_NONBLOCK */; + } + if ((fs_flags & 8) /* WasiFdFlag.RSYNC */ !== 0) { + flags |= 1052672 /* FileControlFlag.O_SYNC */; + needed_inheriting |= WasiRights.FD_SYNC; + } + if ((fs_flags & 16) /* WasiFdFlag.SYNC */ !== 0) { + flags |= 1052672 /* FileControlFlag.O_SYNC */; + needed_inheriting |= WasiRights.FD_SYNC; + } + if ( + write && + (flags & + (1024 /* FileControlFlag.O_APPEND */ | + 512)) /* FileControlFlag.O_TRUNC */ === + 0 + ) { + needed_inheriting |= WasiRights.FD_SEEK; + } + return { flags, needed_base, needed_inheriting }; + } + defineImport( + 'path_open', + function path_open( + dirfd, + dirflags, + path, + path_len, + o_flags, + fs_rights_base, + fs_rights_inheriting, + fs_flags, + fd, + ) { + path = Number(path); + fd = Number(fd); + if (path === 0 || fd === 0) { + return 28 /* WasiErrno.EINVAL */; + } + path_len = Number(path_len); + fs_rights_base = BigInt(fs_rights_base); + fs_rights_inheriting = BigInt(fs_rights_inheriting); + const { + flags: flagsRes, + needed_base: neededBase, + needed_inheriting: neededInheriting, + } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + dirfd, + neededBase, + neededInheriting, + ); + const memory = getMemory(this); + const HEAPU8 = memory.HEAPU8; + const pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + const fs = getFs(this); + const resolved_path = resolvePathSync( + fs, + fileDescriptor, + pathString, + dirflags, + ); + const r = fs.openSync(resolved_path, flagsRes, 0o666); + const filetype = wasi.fds.getFileTypeByFd(r); + if ( + (o_flags & 2) /* WasiFileControlFlag.O_DIRECTORY */ !== 0 && + filetype !== 3 /* WasiFileType.DIRECTORY */ + ) { + return 54 /* WasiErrno.ENOTDIR */; + } + const { base: max_base, inheriting: max_inheriting } = getRights( + wasi.fds.stdio, + r, + flagsRes, + filetype, + ); + const wrap = wasi.fds.insert( + r, + resolved_path, + resolved_path, + filetype, + fs_rights_base & max_base, + fs_rights_inheriting & max_inheriting, + 0, + ); + const stat = fs.fstatSync(r, { bigint: true }); + if (stat.isFile()) { + wrap.size = stat.size; + if ((flagsRes & 1024) /* FileControlFlag.O_APPEND */ !== 0) { + wrap.pos = stat.size; + } + } + const view = memory.view; + view.setInt32(fd, wrap.id, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_open( + dirfd, + dirflags, + path, + path_len, + o_flags, + fs_rights_base, + fs_rights_inheriting, + fs_flags, + fd, + ) { + path = Number(path); + fd = Number(fd); + if (path === 0 || fd === 0) { + return 28 /* WasiErrno.EINVAL */; + } + path_len = Number(path_len); + fs_rights_base = BigInt(fs_rights_base); + fs_rights_inheriting = BigInt(fs_rights_inheriting); + const { + flags: flagsRes, + needed_base: neededBase, + needed_inheriting: neededInheriting, + } = pathOpen(o_flags, fs_rights_base, fs_rights_inheriting, fs_flags); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + dirfd, + neededBase, + neededInheriting, + ); + const memory = getMemory(this); + const HEAPU8 = memory.HEAPU8; + const pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + const fs = getFs(this); + const resolved_path = await resolvePathAsync( + fs, + fileDescriptor, + pathString, + dirflags, + ); + const r = await fs.promises.open(resolved_path, flagsRes, 0o666); + const filetype = await wasi.fds.getFileTypeByFd(r); + if ( + (o_flags & 2) /* WasiFileControlFlag.O_DIRECTORY */ !== 0 && + filetype !== 3 /* WasiFileType.DIRECTORY */ + ) { + return 54 /* WasiErrno.ENOTDIR */; + } + const { base: max_base, inheriting: max_inheriting } = getRights( + wasi.fds.stdio, + r.fd, + flagsRes, + filetype, + ); + const wrap = wasi.fds.insert( + r, + resolved_path, + resolved_path, + filetype, + fs_rights_base & max_base, + fs_rights_inheriting & max_inheriting, + 0, + ); + const stat = await r.stat({ bigint: true }); + if (stat.isFile()) { + wrap.size = stat.size; + if ((flagsRes & 1024) /* FileControlFlag.O_APPEND */ !== 0) { + wrap.pos = stat.size; + } + } + const view = memory.view; + view.setInt32(fd, wrap.id, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32', 'i64', 'i64', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_readlink', + function path_readlink(fd, path, path_len, buf, buf_len, bufused) { + path = Number(path); + path_len = Number(path_len); + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (path === 0 || buf === 0 || bufused === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_READLINK, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + const link = fs.readlinkSync(pathString); + const linkData = encoder.encode(link); + const len = Math.min(linkData.length, buf_len); + if (len >= buf_len) return 42 /* WasiErrno.ENOBUFS */; + HEAPU8.set(linkData.subarray(0, len), buf); + HEAPU8[buf + len] = 0; + view.setUint32(bufused, len, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_readlink(fd, path, path_len, buf, buf_len, bufused) { + path = Number(path); + path_len = Number(path_len); + buf = Number(buf); + buf_len = Number(buf_len); + bufused = Number(bufused); + if (path === 0 || buf === 0 || bufused === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8, view } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_READLINK, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + const link = await fs.promises.readlink(pathString); + const linkData = encoder.encode(link); + const len = Math.min(linkData.length, buf_len); + if (len >= buf_len) return 42 /* WasiErrno.ENOBUFS */; + HEAPU8.set(linkData.subarray(0, len), buf); + HEAPU8[buf + len] = 0; + view.setUint32(bufused, len, true); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_remove_directory', + function path_remove_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_REMOVE_DIRECTORY, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.rmdirSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_remove_directory(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_REMOVE_DIRECTORY, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.rmdir(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_rename', + function path_rename( + old_fd, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, + BigInt(0), + ); + } else { + oldWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_RENAME_SOURCE, + BigInt(0), + ); + newWrap = wasi.fds.get( + new_fd, + WasiRights.PATH_RENAME_TARGET, + BigInt(0), + ); + } + const { HEAPU8 } = getMemory(this); + const resolvedOldPath = resolve( + oldWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ), + ); + const resolvedNewPath = resolve( + newWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ), + ); + const fs = getFs(this); + fs.renameSync(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_rename( + old_fd, + old_path, + old_path_len, + new_fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const wasi = _wasi.get(this); + let oldWrap; + let newWrap; + if (old_fd === new_fd) { + oldWrap = newWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_RENAME_SOURCE | WasiRights.PATH_RENAME_TARGET, + BigInt(0), + ); + } else { + oldWrap = wasi.fds.get( + old_fd, + WasiRights.PATH_RENAME_SOURCE, + BigInt(0), + ); + newWrap = wasi.fds.get( + new_fd, + WasiRights.PATH_RENAME_TARGET, + BigInt(0), + ); + } + const { HEAPU8 } = getMemory(this); + const resolvedOldPath = resolve( + oldWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ), + ); + const resolvedNewPath = resolve( + newWrap.realPath, + decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ), + ); + const fs = getFs(this); + await fs.promises.rename(resolvedOldPath, resolvedNewPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_symlink', + function path_symlink( + old_path, + old_path_len, + fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_SYMLINK, + BigInt(0), + ); + const oldPath = decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ); + let newPath = decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ); + newPath = resolve(fileDescriptor.realPath, newPath); + const fs = getFs(this); + fs.symlinkSync(oldPath, newPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_symlink( + old_path, + old_path_len, + fd, + new_path, + new_path_len, + ) { + old_path = Number(old_path); + old_path_len = Number(old_path_len); + new_path = Number(new_path); + new_path_len = Number(new_path_len); + if (old_path === 0 || new_path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_SYMLINK, + BigInt(0), + ); + const oldPath = decoder.decode( + unsharedSlice(HEAPU8, old_path, old_path + old_path_len), + ); + let newPath = decoder.decode( + unsharedSlice(HEAPU8, new_path, new_path + new_path_len), + ); + newPath = resolve(fileDescriptor.realPath, newPath); + const fs = getFs(this); + await fs.promises.symlink(oldPath, newPath); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32', 'i32', 'i32'], + ['i32'], + ); + defineImport( + 'path_unlink_file', + function path_unlink_file(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_UNLINK_FILE, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + fs.unlinkSync(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + async function path_unlink_file(fd, path, path_len) { + path = Number(path); + path_len = Number(path_len); + if (path === 0) { + return 28 /* WasiErrno.EINVAL */; + } + const { HEAPU8 } = getMemory(this); + const wasi = _wasi.get(this); + const fileDescriptor = wasi.fds.get( + fd, + WasiRights.PATH_UNLINK_FILE, + BigInt(0), + ); + let pathString = decoder.decode( + unsharedSlice(HEAPU8, path, path + path_len), + ); + pathString = resolve(fileDescriptor.realPath, pathString); + const fs = getFs(this); + await fs.promises.unlink(pathString); + return 0 /* WasiErrno.ESUCCESS */; + }, + ['i32', 'i32', 'i32'], + ['i32'], + ); + this._setMemory = function setMemory(m) { + if (!(m instanceof _WebAssembly.Memory)) { + throw new TypeError( + '"instance.exports.memory" property must be a WebAssembly.Memory', + ); + } + _memory.set(_this, extendMemory(m)); + }; + } + static createSync(args, env, preopens, stdio, fs, print, printErr) { + const fds = new SyncTable({ + size: 3, + in: stdio[0], + out: stdio[1], + err: stdio[2], + fs, + print, + printErr, + }); + const _this = new WASI$1(args, env, fds, false, fs); + if (preopens.length > 0) { + for (let i = 0; i < preopens.length; ++i) { + const realPath = fs.realpathSync(preopens[i].realPath, 'utf8'); + const fd = fs.openSync(realPath, 'r', 0o666); + fds.insertPreopen(fd, preopens[i].mappedPath, realPath); + } + } + return _this; + } + static async createAsync( + args, + env, + preopens, + stdio, + fs, + print, + printErr, + asyncify, + ) { + const fds = new AsyncTable({ + size: 3, + in: stdio[0], + out: stdio[1], + err: stdio[2], + print, + printErr, + }); + const _this = new WASI$1(args, env, fds, true, fs, asyncify); + if (preopens.length > 0) { + for (let i = 0; i < preopens.length; ++i) { + const entry = preopens[i]; + const realPath = await fs.promises.realpath(entry.realPath); + const fd = await fs.promises.open(realPath, 'r', 0o666); + await fds.insertPreopen(fd, entry.mappedPath, realPath); + } } + return _this; + } } // eslint-disable-next-line spaced-comment -const kEmptyObject = /*#__PURE__*/ Object.freeze(/*#__PURE__*/ Object.create(null)); +const kEmptyObject = /*#__PURE__*/ Object.freeze( + /*#__PURE__*/ Object.create(null), +); const kExitCode = Symbol('kExitCode'); const kSetMemory = Symbol('kSetMemory'); const kStarted = Symbol('kStarted'); const kInstance = Symbol('kInstance'); const kBindingName = Symbol('kBindingName'); function setupInstance(self, instance) { - validateObject(instance, 'instance'); - validateObject(instance.exports, 'instance.exports'); - self[kInstance] = instance; - self[kSetMemory](instance.exports.memory); + validateObject(instance, 'instance'); + validateObject(instance.exports, 'instance.exports'); + self[kInstance] = instance; + self[kSetMemory](instance.exports.memory); } function validateOptions(options) { - var _a; - validateObject(options, 'options'); - let _WASI; - if (options.version !== undefined) { - validateString(options.version, 'options.version'); - switch (options.version) { - case 'unstable': - _WASI = WASI$1; - this[kBindingName] = 'wasi_unstable'; - break; - case 'preview1': - _WASI = WASI$1; - this[kBindingName] = 'wasi_snapshot_preview1'; - break; - default: - throw new TypeError(`unsupported WASI version "${options.version}"`); - } - } - else { + var _a; + validateObject(options, 'options'); + let _WASI; + if (options.version !== undefined) { + validateString(options.version, 'options.version'); + switch (options.version) { + case 'unstable': + _WASI = WASI$1; + this[kBindingName] = 'wasi_unstable'; + break; + case 'preview1': _WASI = WASI$1; this[kBindingName] = 'wasi_snapshot_preview1'; + break; + default: + throw new TypeError(`unsupported WASI version "${options.version}"`); } - if (options.args !== undefined) { - validateArray(options.args, 'options.args'); - } - const args = ((_a = options.args) !== null && _a !== void 0 ? _a : []).map(String); - const env = []; - if (options.env !== undefined) { - validateObject(options.env, 'options.env'); - Object.entries(options.env).forEach(({ 0: key, 1: value }) => { - if (value !== undefined) { - env.push(`${key}=${value}`); - } - }); + } else { + _WASI = WASI$1; + this[kBindingName] = 'wasi_snapshot_preview1'; + } + if (options.args !== undefined) { + validateArray(options.args, 'options.args'); + } + const args = ((_a = options.args) !== null && _a !== void 0 ? _a : []).map( + String, + ); + const env = []; + if (options.env !== undefined) { + validateObject(options.env, 'options.env'); + Object.entries(options.env).forEach(({ 0: key, 1: value }) => { + if (value !== undefined) { + env.push(`${key}=${value}`); + } + }); + } + const preopens = []; + if (options.preopens !== undefined) { + validateObject(options.preopens, 'options.preopens'); + Object.entries(options.preopens).forEach(({ 0: key, 1: value }) => + preopens.push({ mappedPath: String(key), realPath: String(value) }), + ); + } + if (preopens.length > 0) { + if (options.fs === undefined) { + throw new Error('filesystem is disabled, can not preopen directory'); } - const preopens = []; - if (options.preopens !== undefined) { - validateObject(options.preopens, 'options.preopens'); - Object.entries(options.preopens).forEach(({ 0: key, 1: value }) => preopens.push({ mappedPath: String(key), realPath: String(value) })); + try { + validateObject(options.fs, 'options.fs'); + } catch (_) { + throw new TypeError('Node.js fs like implementation is not provided'); } - if (preopens.length > 0) { - if (options.fs === undefined) { - throw new Error('filesystem is disabled, can not preopen directory'); - } - try { - validateObject(options.fs, 'options.fs'); - } - catch (_) { - throw new TypeError('Node.js fs like implementation is not provided'); - } - } - // if (options.filesystem !== undefined) { - // validateObject(options.filesystem, 'options.filesystem') - // validateString(options.filesystem.type, 'options.filesystem.type') - // if (options.filesystem.type !== 'memfs' && options.filesystem.type !== 'file-system-access-api') { - // throw new Error(`Filesystem type ${(options.filesystem as any).type as string} is not supported, only "memfs" and "file-system-access-api" is supported currently`) - // } - // try { - // validateObject(options.filesystem.fs, 'options.filesystem.fs') - // } catch (_) { - // throw new Error('Node.js fs like implementation is not provided') - // } - // } - if (options.print !== undefined) - validateFunction(options.print, 'options.print'); - if (options.printErr !== undefined) - validateFunction(options.printErr, 'options.printErr'); - if (options.returnOnExit !== undefined) { - validateBoolean(options.returnOnExit, 'options.returnOnExit'); - } - // const { stdin = 0, stdout = 1, stderr = 2 } = options - // validateInt32(stdin, 'options.stdin', 0) - // validateInt32(stdout, 'options.stdout', 0) - // validateInt32(stderr, 'options.stderr', 0) - // const stdio = [stdin, stdout, stderr] as const - const stdio = [0, 1, 2]; - return { - args, - env, - preopens, - stdio, - _WASI - }; + } + // if (options.filesystem !== undefined) { + // validateObject(options.filesystem, 'options.filesystem') + // validateString(options.filesystem.type, 'options.filesystem.type') + // if (options.filesystem.type !== 'memfs' && options.filesystem.type !== 'file-system-access-api') { + // throw new Error(`Filesystem type ${(options.filesystem as any).type as string} is not supported, only "memfs" and "file-system-access-api" is supported currently`) + // } + // try { + // validateObject(options.filesystem.fs, 'options.filesystem.fs') + // } catch (_) { + // throw new Error('Node.js fs like implementation is not provided') + // } + // } + if (options.print !== undefined) + validateFunction(options.print, 'options.print'); + if (options.printErr !== undefined) + validateFunction(options.printErr, 'options.printErr'); + if (options.returnOnExit !== undefined) { + validateBoolean(options.returnOnExit, 'options.returnOnExit'); + } + // const { stdin = 0, stdout = 1, stderr = 2 } = options + // validateInt32(stdin, 'options.stdin', 0) + // validateInt32(stdout, 'options.stdout', 0) + // validateInt32(stderr, 'options.stderr', 0) + // const stdio = [stdin, stdout, stderr] as const + const stdio = [0, 1, 2]; + return { + args, + env, + preopens, + stdio, + _WASI, + }; } function initWASI(setMemory, wrap) { - this[kSetMemory] = setMemory; - this.wasiImport = wrap; - this[kStarted] = false; - this[kExitCode] = 0; - this[kInstance] = undefined; + this[kSetMemory] = setMemory; + this.wasiImport = wrap; + this[kStarted] = false; + this[kExitCode] = 0; + this[kInstance] = undefined; } /** @public */ class WASI { - constructor(options = kEmptyObject) { - const { args, env, preopens, stdio, _WASI } = validateOptions.call(this, options); - const wrap = _WASI.createSync(args, env, preopens, stdio, options.fs, options.print, options.printErr); - const setMemory = wrap._setMemory; - delete wrap._setMemory; - initWASI.call(this, setMemory, wrap); - if (options.returnOnExit) { - wrap.proc_exit = wasiReturnOnProcExit.bind(this); - } - } - // Must not export _initialize, must export _start - start(instance) { - if (this[kStarted]) { - throw new Error('WASI instance has already started'); - } - this[kStarted] = true; - setupInstance(this, instance); - const { _start, _initialize } = this[kInstance].exports; - validateFunction(_start, 'instance.exports._start'); - validateUndefined(_initialize, 'instance.exports._initialize'); - let ret; - try { - ret = _start(); - } - catch (err) { - if (err !== kExitCode) { - throw err; - } - } - if (ret instanceof Promise) { - return ret.then(() => this[kExitCode], (err) => { - if (err !== kExitCode) { - throw err; - } - return this[kExitCode]; - }); - } - return this[kExitCode]; + constructor(options = kEmptyObject) { + const { args, env, preopens, stdio, _WASI } = validateOptions.call( + this, + options, + ); + const wrap = _WASI.createSync( + args, + env, + preopens, + stdio, + options.fs, + options.print, + options.printErr, + ); + const setMemory = wrap._setMemory; + delete wrap._setMemory; + initWASI.call(this, setMemory, wrap); + if (options.returnOnExit) { + wrap.proc_exit = wasiReturnOnProcExit.bind(this); } - // Must not export _start, may optionally export _initialize - initialize(instance) { - if (this[kStarted]) { - throw new Error('WASI instance has already started'); - } - this[kStarted] = true; - setupInstance(this, instance); - const { _start, _initialize } = this[kInstance].exports; - validateUndefined(_start, 'instance.exports._start'); - if (_initialize !== undefined) { - validateFunction(_initialize, 'instance.exports._initialize'); - return _initialize(); - } + } + // Must not export _initialize, must export _start + start(instance) { + if (this[kStarted]) { + throw new Error('WASI instance has already started'); + } + this[kStarted] = true; + setupInstance(this, instance); + const { _start, _initialize } = this[kInstance].exports; + validateFunction(_start, 'instance.exports._start'); + validateUndefined(_initialize, 'instance.exports._initialize'); + let ret; + try { + ret = _start(); + } catch (err) { + if (err !== kExitCode) { + throw err; + } } - getImportObject() { - return { [this[kBindingName]]: this.wasiImport }; + if (ret instanceof Promise) { + return ret.then( + () => this[kExitCode], + (err) => { + if (err !== kExitCode) { + throw err; + } + return this[kExitCode]; + }, + ); + } + return this[kExitCode]; + } + // Must not export _start, may optionally export _initialize + initialize(instance) { + if (this[kStarted]) { + throw new Error('WASI instance has already started'); } + this[kStarted] = true; + setupInstance(this, instance); + const { _start, _initialize } = this[kInstance].exports; + validateUndefined(_start, 'instance.exports._start'); + if (_initialize !== undefined) { + validateFunction(_initialize, 'instance.exports._initialize'); + return _initialize(); + } + } + getImportObject() { + return { [this[kBindingName]]: this.wasiImport }; + } } function wasiReturnOnProcExit(rval) { - this[kExitCode] = rval; - // eslint-disable-next-line @typescript-eslint/no-throw-literal - throw kExitCode; + this[kExitCode] = rval; + // eslint-disable-next-line @typescript-eslint/no-throw-literal + throw kExitCode; } // @ts-check @@ -11363,15 +14109,15 @@ function wasiReturnOnProcExit(rval) { * @param {unknown} value */ const getType = (value) => { - if (value === undefined) return 0 - if (value === null) return 1 - const t = typeof value; - if (t === 'boolean') return 2 - if (t === 'number') return 3 - if (t === 'string') return 4 - if (t === 'object') return 6 - if (t === 'bigint') return 9 - return -1 + if (value === undefined) return 0; + if (value === null) return 1; + const t = typeof value; + if (t === 'boolean') return 2; + if (t === 'number') return 3; + if (t === 'string') return 4; + if (t === 'object') return 6; + if (t === 'bigint') return 9; + return -1; }; /** @@ -11381,174 +14127,197 @@ const getType = (value) => { * @returns {Uint8Array} */ const encodeValue = (memfs, value, type) => { - switch (type) { - case 0: - case 1: - return new Uint8Array(0) - case 2: { - const view = new Int32Array(1); - view[0] = value ? 1 : 0; - return new Uint8Array(view.buffer) - } - case 3: { - const view = new Float64Array(1); - view[0] = value; - return new Uint8Array(view.buffer) - } - case 4: { - const view = new TextEncoder().encode(value); - return view - } - case 6: { - const [entry] = Object.entries(memfs).filter(([_, v]) => v === value.constructor)[0] ?? []; - if (entry) { - Object.defineProperty(value, '__constructor__', { - configurable: true, - writable: true, - enumerable: true, - value: entry - }); - } + switch (type) { + case 0: + case 1: + return new Uint8Array(0); + case 2: { + const view = new Int32Array(1); + view[0] = value ? 1 : 0; + return new Uint8Array(view.buffer); + } + case 3: { + const view = new Float64Array(1); + view[0] = value; + return new Uint8Array(view.buffer); + } + case 4: { + const view = new TextEncoder().encode(value); + return view; + } + case 6: { + const [entry] = + Object.entries(memfs).filter(([_, v]) => v === value.constructor)[0] ?? + []; + if (entry) { + Object.defineProperty(value, '__constructor__', { + configurable: true, + writable: true, + enumerable: true, + value: entry, + }); + } - const json = JSON.stringify(value, (_, value) => { - if (typeof value === 'bigint') { - return `BigInt(${String(value)})` - } - return value - }); - const view = new TextEncoder().encode(json); - return view - } - case 9: { - const view = new BigInt64Array(1); - view[0] = value; - return new Uint8Array(view.buffer) - } - case -1: - default: - throw new Error('unsupported data') + const json = JSON.stringify(value, (_, value) => { + if (typeof value === 'bigint') { + return `BigInt(${String(value)})`; + } + return value; + }); + const view = new TextEncoder().encode(json); + return view; } + case 9: { + const view = new BigInt64Array(1); + view[0] = value; + return new Uint8Array(view.buffer); + } + case -1: + default: + throw new Error('unsupported data'); + } }; /** * @param {import('memfs').IFs} fs * @returns {(e: { data: { __fs__: { sab: Int32Array, type: keyof import('memfs').IFs, payload: any[] } } }) => void} */ -var createOnMessage = (fs) => function onMessage(e) { +var createOnMessage = (fs) => + function onMessage(e) { if (e.data.__fs__) { - /** - * 0..4 status(int32_t): 21(waiting) 0(success) 1(error) - * 5..8 type(napi_valuetype): 0(undefined) 1(null) 2(boolean) 3(number) 4(string) 6(jsonstring) 9(bigint) -1(unsupported) - * 9..16 payload_size(uint32_t) <= 1024 - * 16..16 + payload_size payload_content - */ - const { sab, type, payload } = e.data.__fs__; - const fn = fs[type]; - const args = payload ? payload.map((value) => { + /** + * 0..4 status(int32_t): 21(waiting) 0(success) 1(error) + * 5..8 type(napi_valuetype): 0(undefined) 1(null) 2(boolean) 3(number) 4(string) 6(jsonstring) 9(bigint) -1(unsupported) + * 9..16 payload_size(uint32_t) <= 1024 + * 16..16 + payload_size payload_content + */ + const { sab, type, payload } = e.data.__fs__; + const fn = fs[type]; + const args = payload + ? payload.map((value) => { if (value instanceof Uint8Array) { - // buffer polyfill bug - // @ts-expect-error - value._isBuffer = true; + // buffer polyfill bug + // @ts-expect-error + value._isBuffer = true; } - return value - }) : payload; - try { - const ret = fn.apply(fs, args); - const t = getType(ret); - const v = encodeValue(fs, ret, t); - Atomics.store(sab, 0, 0); - Atomics.store(sab, 1, t); - Atomics.store(sab, 2, v.length); - new Uint8Array(sab.buffer).set(v, 16); - - } catch (/** @type {any} */ err) { - Atomics.store(sab, 0, 1); - Atomics.store(sab, 1, 6); - const payloadContent = new TextEncoder().encode(JSON.stringify({ - ...err, - message: err.message, - stack: err.stack - })); - Atomics.store(sab, 2, payloadContent.length); - new Uint8Array(sab.buffer).set(payloadContent, 16); - } finally { - Atomics.notify(sab, 0); - } + return value; + }) + : payload; + try { + const ret = fn.apply(fs, args); + const t = getType(ret); + const v = encodeValue(fs, ret, t); + Atomics.store(sab, 0, 0); + Atomics.store(sab, 1, t); + Atomics.store(sab, 2, v.length); + new Uint8Array(sab.buffer).set(v, 16); + } catch (/** @type {any} */ err) { + Atomics.store(sab, 0, 1); + Atomics.store(sab, 1, 6); + const payloadContent = new TextEncoder().encode( + JSON.stringify({ + ...err, + message: err.message, + stack: err.stack, + }), + ); + Atomics.store(sab, 2, payloadContent.length); + new Uint8Array(sab.buffer).set(payloadContent, 16); + } finally { + Atomics.notify(sab, 0); + } } -}; + }; /** * @param {import('memfs').IFs} memfs */ -var createFsProxy = (memfs) => new Proxy({}, { - get(_target, p, _receiver) { +var createFsProxy = (memfs) => + new Proxy( + {}, + { + get(_target, p, _receiver) { /** * @param {any[]} args */ return function (...args) { - const sab = new SharedArrayBuffer(16 + 1024); - const i32arr = new Int32Array(sab); - Atomics.store(i32arr, 0, 21); + const sab = new SharedArrayBuffer(16 + 1024); + const i32arr = new Int32Array(sab); + Atomics.store(i32arr, 0, 21); - // @ts-expect-error - postMessage({ - __fs__: { - sab: i32arr, - type: p, - payload: args - } - }); + // @ts-expect-error + postMessage({ + __fs__: { + sab: i32arr, + type: p, + payload: args, + }, + }); - Atomics.wait(i32arr, 0, 21); + Atomics.wait(i32arr, 0, 21); - const status = Atomics.load(i32arr, 0); - const type = Atomics.load(i32arr, 1); - const size = Atomics.load(i32arr, 2); - const content = new Uint8Array(sab, 16, size); - if (status === 1) { - const errobj = JSON.parse(new TextDecoder().decode(content.slice())); - const err = new Error(errobj.message); - Object.defineProperty(err, 'stack', { - configurable: true, - enumerable: false, - writable: true, - value: errobj.stack - }); - for (const [k, v] of Object.entries(errobj)) { - if (k === 'message' || k === 'stack') continue - // @ts-expect-error - err[k] = v; - } - throw err + const status = Atomics.load(i32arr, 0); + const type = Atomics.load(i32arr, 1); + const size = Atomics.load(i32arr, 2); + const content = new Uint8Array(sab, 16, size); + if (status === 1) { + const errobj = JSON.parse( + new TextDecoder().decode(content.slice()), + ); + const err = new Error(errobj.message); + Object.defineProperty(err, 'stack', { + configurable: true, + enumerable: false, + writable: true, + value: errobj.stack, + }); + for (const [k, v] of Object.entries(errobj)) { + if (k === 'message' || k === 'stack') continue; + // @ts-expect-error + err[k] = v; } - if (type === 0) return undefined - if (type === 1) return null - if (type === 2) return Boolean(content[0]) - if (type === 3) return new Float64Array(sab, 16, 1)[0] - if (type === 4) return new TextDecoder().decode(content.slice()) - if (type === 6) { - const obj = JSON.parse(new TextDecoder().decode(content.slice()), (_key, value) => { - if (typeof value === 'string') { - const matched = value.match(/^BigInt\((-?\d+)\)$/); - if (matched && matched[1]) { - return BigInt(matched[1]) - } - } - return value - }); - if (obj.__constructor__) { - const ctor = obj.__constructor__; - delete obj.__constructor__; - // @ts-expect-error - Object.setPrototypeOf(obj, memfs[ctor].prototype); + throw err; + } + if (type === 0) return undefined; + if (type === 1) return null; + if (type === 2) return Boolean(content[0]); + if (type === 3) return new Float64Array(sab, 16, 1)[0]; + if (type === 4) return new TextDecoder().decode(content.slice()); + if (type === 6) { + const obj = JSON.parse( + new TextDecoder().decode(content.slice()), + (_key, value) => { + if (typeof value === 'string') { + const matched = value.match(/^BigInt\((-?\d+)\)$/); + if (matched && matched[1]) { + return BigInt(matched[1]); + } } - return obj - } - if (type === 9) return new BigInt64Array(sab, 16, 1)[0] - throw new Error('unsupported data') - } - } -}); + return value; + }, + ); + if (obj.__constructor__) { + const ctor = obj.__constructor__; + delete obj.__constructor__; + // @ts-expect-error + Object.setPrototypeOf(obj, memfs[ctor].prototype); + } + return obj; + } + if (type === 9) return new BigInt64Array(sab, 16, 1)[0]; + throw new Error('unsupported data'); + }; + }, + }, + ); -export { MessageHandler, WASI, createFsProxy, createOnMessage, getDefaultContext, instantiateNapiModule, instantiateNapiModuleSync }; +export { + MessageHandler, + WASI, + createFsProxy, + createOnMessage, + getDefaultContext, + instantiateNapiModule, + instantiateNapiModuleSync, +}; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BlbW5hcGkvY29yZS9kaXN0L2VtbmFwaS1jb3JlLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9ydW50aW1lL2Rpc3QvZW1uYXBpLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0eWJ5cy93YXNtLXV0aWwvZGlzdC93YXNtLXV0aWwuZXNtLWJ1bmRsZXIuanMiLCIuLi9mcy1wcm94eS5janMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbnZhciBfV2ViQXNzZW1ibHkgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgPyBXZWJBc3NlbWJseVxuICAgIDogdHlwZW9mIFdYV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gV1hXZWJBc3NlbWJseVxuICAgICAgICA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKSB7XG4gICAgaWYgKGltcG9ydHMgJiYgdHlwZW9mIGltcG9ydHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltcG9ydHMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbG9hZCh3YXNtSW5wdXQsIGltcG9ydHMpIHtcbiAgICBpZiAoIXdhc21JbnB1dClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgLy8gUHJvbWlzZTxzdHJpbmcgfCBVUkwgfCBSZXNwb25zZSB8IEJ1ZmZlclNvdXJjZSB8IFdlYkFzc2VtYmx5Lk1vZHVsZT5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdGhlbiA9IHR5cGVvZiB3YXNtSW5wdXQgPT09ICdvYmplY3QnICYmIHdhc21JbnB1dCAhPT0gbnVsbCAmJiAndGhlbicgaW4gd2FzbUlucHV0ID8gd2FzbUlucHV0LnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoZW4uY2FsbCh3YXNtSW5wdXQsIGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gbG9hZChpbnB1dCwgaW1wb3J0cyk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfKSB7IH1cbiAgICAvLyBCdWZmZXJTb3VyY2VcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgIH1cbiAgICAvLyBXZWJBc3NlbWJseS5Nb2R1bGVcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cykudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiB3YXNtSW5wdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFJlc3BvbnNlXG4gICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHdhc21JbnB1dC5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShidWZmZXIsIGltcG9ydHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gc3RyaW5nIHwgVVJMXG4gICAgdmFyIGlucHV0SXNTdHJpbmcgPSB0eXBlb2Ygd2FzbUlucHV0ID09PSAnc3RyaW5nJztcbiAgICBpZiAoaW5wdXRJc1N0cmluZyB8fCAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAgICBpZiAoaW5wdXRJc1N0cmluZyAmJiB0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc20gc291cmNlIGNhbiBub3QgYmUgYSBzdHJpbmcgb3IgVVJMIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xufVxuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgaWYgKCF3YXNtSW5wdXQpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIHZhciBtb2R1bGU7XG4gICAgaWYgKCh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgbW9kdWxlID0gbmV3IF9XZWJBc3NlbWJseS5Nb2R1bGUod2FzbUlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZSA9IHdhc21JbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB9XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IF9XZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpO1xuICAgIHZhciBzb3VyY2UgPSB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpIHtcbiAgICB2YXIgbmFwaU1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgdmFyIHJldXNlV29ya2VyID0gQm9vbGVhbihvcHRpb25zLnJldXNlV29ya2VyKTtcbiAgICAgICAgdmFyIHdhc21JbnN0YW5jZTtcbiAgICAgICAgdmFyIHdhc21Nb2R1bGU7XG4gICAgICAgIHZhciB3YXNtTWVtb3J5O1xuICAgICAgICB2YXIgd2FzbVRhYmxlO1xuICAgICAgICB2YXIgX21hbGxvYztcbiAgICAgICAgdmFyIF9mcmVlO1xuICAgICAgICBmdW5jdGlvbiBhYm9ydChtc2cpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBfV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYXBpTW9kdWxlID0ge1xuICAgICAgICAgICAgaW1wb3J0czoge1xuICAgICAgICAgICAgICAgIGVudjoge30sXG4gICAgICAgICAgICAgICAgbmFwaToge30sXG4gICAgICAgICAgICAgICAgZW1uYXBpOiB7fVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cG9ydHM6IHt9LFxuICAgICAgICAgICAgZW1uYXBpOiB7fSxcbiAgICAgICAgICAgIGxvYWRlZDogZmFsc2UsXG4gICAgICAgICAgICBmaWxlbmFtZTogJycsXG4gICAgICAgICAgICBjaGlsZFRocmVhZDogQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKSxcbiAgICAgICAgICAgIHNwYXduVGhyZWFkOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGFydFRocmVhZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdFdvcmtlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXhlY3V0ZUFzeW5jV29yazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFwaU1vZHVsZS5sb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5hcGkgaW5pdCBvcHRpb25zJyk7XG4gICAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gb3B0aW9ucy5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZSA9PT0gbnVsbCB8fCBpbnN0YW5jZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5zdGFuY2UuZXhwb3J0cykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIHdhc21JbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gb3B0aW9ucy5tb2R1bGU7XG4gICAgICAgICAgICAgICAgdmFyIG1lbW9yeSA9IG9wdGlvbnMubWVtb3J5IHx8IGV4cG9ydHMubWVtb3J5O1xuICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IG9wdGlvbnMudGFibGUgfHwgZXhwb3J0cy5fX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlO1xuICAgICAgICAgICAgICAgIGlmICghKG1vZHVsZSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5Nb2R1bGUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gbW9kdWxlJyk7XG4gICAgICAgICAgICAgICAgaWYgKCEobWVtb3J5IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1lbW9yeSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBpZiAoISh0YWJsZSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5UYWJsZSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSB0YWJsZScpO1xuICAgICAgICAgICAgICAgIHdhc21Nb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgICAgICAgICAgd2FzbU1lbW9yeSA9IG1lbW9yeTtcbiAgICAgICAgICAgICAgICB3YXNtVGFibGUgPSB0YWJsZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMubWFsbG9jICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxsb2MgaXMgbm90IGV4cG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzLmZyZWUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZyZWUgaXMgbm90IGV4cG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgX21hbGxvYyA9IGV4cG9ydHMubWFsbG9jO1xuICAgICAgICAgICAgICAgIF9mcmVlID0gZXhwb3J0cy5mcmVlO1xuICAgICAgICAgICAgICAgIGlmICghbmFwaU1vZHVsZS5jaGlsZFRocmVhZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYWluIHRocmVhZCBvbmx5XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVBcGlWZXJzaW9uID0gOCAvKiBWZXJzaW9uLk5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OICovO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MSA9IGluc3RhbmNlLmV4cG9ydHMubm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcGlWZXJzaW9uID0gbm9kZV9hcGlfbW9kdWxlX2dldF9hcGlfdmVyc2lvbl92MSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gbmFwaU1vZHVsZS5lbnZPYmplY3QgfHwgKG5hcGlNb2R1bGUuZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmNyZWF0ZUVudihuYXBpTW9kdWxlLmZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBmdW5jdGlvbiAoY2IpIHsgcmV0dXJuICh3YXNtVGFibGUuZ2V0KGNiKSk7IH0sIGZ1bmN0aW9uIChjYikgeyByZXR1cm4gKHdhc21UYWJsZS5nZXQoY2IpKTsgfSwgYWJvcnQsIGVtbmFwaU5vZGVCaW5kaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY29wZV8xID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxJbnRvTW9kdWxlKGZ1bmN0aW9uIChfZW52T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHMgPSBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4cG9ydHNIYW5kbGUgPSBzY29wZV8xLmFkZChleHBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFwaV9yZWdpc3Rlcl93YXNtX3YxID0gaW5zdGFuY2UuZXhwb3J0cy5uYXBpX3JlZ2lzdGVyX3dhc21fdjE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9IG5hcGlfcmVnaXN0ZXJfd2FzbV92MShfZW52T2JqZWN0LmlkLCBleHBvcnRzSGFuZGxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXBpTW9kdWxlLmV4cG9ydHMgPSAoIW5hcGlWYWx1ZSkgPyBleHBvcnRzIDogZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYXBpVmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5hcGlNb2R1bGUuZW52T2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFwaU1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGVtbmFwaUN0eDtcbiAgICAgICAgdmFyIGVtbmFwaU5vZGVCaW5kaW5nO1xuICAgICAgICB2YXIgb25DcmVhdGVXb3JrZXI7XG4gICAgICAgIHZhciBlcnI7XG4gICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnIHx8IGNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBgb3B0aW9ucy5jb250ZXh0YC4gVXNlIGBpbXBvcnQgeyBnZXREZWZhdWx0Q29udGV4dCB9IGZyb20gJ0BlbW5hcGkvcnVudGltZSdgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4ID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICAgICAgdmFyIHBvc3RNc2cgPSB0eXBlb2Ygb3B0aW9ucy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5wb3N0TWVzc2FnZVxuICAgICAgICAgICAgICAgIDogdHlwZW9mIHBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgICAgID8gcG9zdE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBvc3RNc2cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBwb3N0TWVzc2FnZSBmb3VuZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFwaU1vZHVsZS5wb3N0TWVzc2FnZSA9IHBvc3RNc2c7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbmFwaU1vZHVsZS5maWxlbmFtZSA9IG9wdGlvbnMuZmlsZW5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uQ3JlYXRlV29ya2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvbkNyZWF0ZVdvcmtlciA9IG9wdGlvbnMub25DcmVhdGVXb3JrZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnByaW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJpbnRFcnIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGVyciA9IG9wdGlvbnMucHJpbnRFcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ25vZGVCaW5kaW5nJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB2YXIgbm9kZUJpbmRpbmcgPSBvcHRpb25zLm5vZGVCaW5kaW5nO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlQmluZGluZyAhPT0gJ29iamVjdCcgfHwgbm9kZUJpbmRpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGBvcHRpb25zLm5vZGVCaW5kaW5nYC4gVXNlIEBlbW5hcGkvbm9kZS1iaW5kaW5nIHBhY2thZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nID0gbm9kZUJpbmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gMDtcbiAgICAgICAgaWYgKCdhc3luY1dvcmtQb29sU2l6ZScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmFzeW5jV29ya1Bvb2xTaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuYXN5bmNXb3JrUG9vbFNpemUgbXVzdCBiZSBhIGludGVnZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gb3B0aW9ucy5hc3luY1dvcmtQb29sU2l6ZSA+PiAwO1xuICAgICAgICAgICAgaWYgKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID4gMTAyNCkge1xuICAgICAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gMTAyNDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplIDwgLTEwMjQpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSA9IC0xMDI0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzaW5nbGVUaHJlYWRBc3luY1dvcmsgPSBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID8gZmFsc2UgOiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPD0gMCk7XG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYXN5bmNfd29ya19wb29sX3NpemUoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYuX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSA9IF9lbW5hcGlfYXN5bmNfd29ya19wb29sX3NpemU7XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwdGhyZWFkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQWRkU2VuZExpc3RlbmVyKHdvcmtlcikge1xuICAgICAgICAgICAgaWYgKCF3b3JrZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgdmFyIF9fZW1uYXBpX18gPSBkYXRhLl9fZW1uYXBpX187XG4gICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18gJiYgX19lbW5hcGlfXy50eXBlID09PSAnYXN5bmMtc2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlXzEoeyBfX2VtbmFwaV9fOiBfX2VtbmFwaV9fIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gX19lbW5hcGlfXy5wYXlsb2FkLmNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShfX2VtbmFwaV9fLnBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaVNlbmRMaXN0ZW5lcjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3b3JrZXIuX2VtbmFwaVNlbmRMaXN0ZW5lciA9IHsgaGFuZGxlcjogaGFuZGxlciwgZGlzcG9zZTogZGlzcG9zZSB9O1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuYWRkU2VuZExpc3RlbmVyID0gZW1uYXBpQWRkU2VuZExpc3RlbmVyO1xuICAgICAgICBmdW5jdGlvbiB0ZXJtaW5hdGVXb3JrZXIod29ya2VyKSB7XG4gICAgICAgICAgICB2YXIgdGlkID0gd29ya2VyLl9fZW1uYXBpX3RpZDtcbiAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLmRhdGEuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgICAgICBlcnIoJ3JlY2VpdmVkIFwiJyArIGUuZGF0YS5fX2VtbmFwaV9fLnR5cGUgKyAnXCIgY29tbWFuZCBmcm9tIHRlcm1pbmF0ZWQgd29ya2VyOiAnICsgdGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNwYXduVGhyZWFkKHN0YXJ0QXJnLCBlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICB2YXIgaXNOZXdBQkkgPSBlcnJvck9yVGlkICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIWlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JPclRpZCA9IF9tYWxsb2MoOCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtNDg7IC8qIEVOT01FTSAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzdHJ1Y3QgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgZXJyb3JPclRpZCwgMik7XG4gICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMCwgMCk7XG4gICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMSwgMCk7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8yID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NwYXduLXRocmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRBcmc6IHN0YXJ0QXJnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yT3JUaWQ6IGVycm9yT3JUaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChzdHJ1Y3QsIDEsIDApO1xuICAgICAgICAgICAgICAgIHZhciBpc0Vycm9yID0gQXRvbWljcy5sb2FkKHN0cnVjdCwgMCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEF0b21pY3MubG9hZChzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2ZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3IgPyAtcmVzdWx0IDogcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdvcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd29ya2VyID0gUFRocmVhZC5nZXROZXdXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgbmV3IHdvcmtlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIEVBR0FJTiA9IDY7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDEpO1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0LCAxLCBFQUdBSU4pO1xuICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KHN0cnVjdCwgMSk7XG4gICAgICAgICAgICAgICAgZXJyKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0aWQgPSBQVGhyZWFkLm5leHRXb3JrZXJJRCArIDQzO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIHRpZCk7XG4gICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgdmFyIFdBU0lfVEhSRUFEU19NQVhfVElEID0gMHgxRkZGRkZGRjtcbiAgICAgICAgICAgIFBUaHJlYWQubmV4dFdvcmtlcklEID0gKFBUaHJlYWQubmV4dFdvcmtlcklEICsgMSkgJSAoV0FTSV9USFJFQURTX01BWF9USUQgLSA0Mik7XG4gICAgICAgICAgICBQVGhyZWFkLnB0aHJlYWRzW3RpZF0gPSB3b3JrZXI7XG4gICAgICAgICAgICB3b3JrZXIuX19lbW5hcGlfdGlkID0gdGlkO1xuICAgICAgICAgICAgUFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWQ6IHRpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogc3RhcnRBcmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGlzTmV3QUJJKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgIHJldHVybiB0aWQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc3RhcnRUaHJlYWQodGlkLCBzdGFydEFyZykge1xuICAgICAgICAgICAgaWYgKG5hcGlNb2R1bGUuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdhc21JbnN0YW5jZS5leHBvcnRzLndhc2lfdGhyZWFkX3N0YXJ0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc2lfdGhyZWFkX3N0YXJ0IGlzIG5vdCBleHBvcnRlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VfMyA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQodGlkLCBzdGFydEFyZyk7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMyh7XG4gICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGVhbnVwLXRocmVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkOiB0aWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydFRocmVhZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBjaGlsZCB0aHJlYWRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5zcGF3blRocmVhZCA9IHNwYXduVGhyZWFkO1xuICAgICAgICBuYXBpTW9kdWxlLnN0YXJ0VGhyZWFkID0gc3RhcnRUaHJlYWQ7XG4gICAgICAgIHZhciBQVGhyZWFkID0ge1xuICAgICAgICAgICAgdW51c2VkV29ya2VyczogW10sXG4gICAgICAgICAgICBydW5uaW5nV29ya2VyczogW10sXG4gICAgICAgICAgICBwdGhyZWFkczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5leHRXb3JrZXJJRDogMCxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgICAgIHJldHVybldvcmtlclRvUG9vbDogZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICAgICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBQVGhyZWFkLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRXYXNtTW9kdWxlVG9Xb3JrZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyLndoZW5Mb2FkZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXIud2hlbkxvYWRlZDtcbiAgICAgICAgICAgICAgICB3b3JrZXIud2hlbkxvYWRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGUuZGF0YS5fX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUgJiYgIXdvcmtlci5fX2VtbmFwaV90aWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHBheWxvYWQuZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZXJyKCdmYWlsZWQgdG8gbG9hZCBpbiBjaGlsZCB0aHJlYWQ6ICcgKyAocGF5bG9hZC5lcnIubWVzc2FnZSB8fCBwYXlsb2FkLmVycikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3NwYXduLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhd25UaHJlYWQocGF5bG9hZC5zdGFydEFyZywgcGF5bG9hZC5lcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2NsZWFudXAtdGhyZWFkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV1c2VXb3JrZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUaHJlYWQucmV0dXJuV29ya2VyVG9Qb29sKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgUFRocmVhZC5wdGhyZWFkc1twYXlsb2FkLnRpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVXb3JrZXIod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9ICd3b3JrZXIgc2VudCBhbiBlcnJvciEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHdvcmtlci5wdGhyZWFkX3B0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBtZXNzYWdlID0gJ1B0aHJlYWQgJyArIHB0clRvU3RyaW5nKHdvcmtlci5wdGhyZWFkX3B0cikgKyAnIHNlbnQgYW4gZXJyb3IhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyKG1lc3NhZ2UgKyAnICcgKyBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignZGV0YWNoZWRFeGl0JywgZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBuYXBpTW9kdWxlLmVtbmFwaS5hZGRTZW5kTGlzdGVuZXIod29ya2VyKVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBZGRTZW5kTGlzdGVuZXIod29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBlbW5hcGlUU0ZOICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgIGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIod29ya2VyKVxuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNtTW9kdWxlOiB3YXNtTW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeTogd2FzbU1lbW9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgfHwgISh3YXNtTWVtb3J5LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGl0aHJlYWQgZmVhdHVyZXMgcmVxdWlyZSBzaGFyZWQgd2FzbSBtZW1vcnkuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJ5IHRvIGNvbXBpbGUgd2l0aCBgLW1hdG9taWNzIC1tYnVsay1tZW1vcnlgIGFuZCB1c2UgYC0taW1wb3J0LW1lbW9yeSAtLXNoYXJlZC1tZW1vcnlgIGR1cmluZyBsaW5raW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyLndoZW5Mb2FkZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWxsb2NhdGVVbnVzZWRXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ3JlYXRlV29ya2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IG9uQ3JlYXRlV29ya2VyKHsgdHlwZTogJ3RocmVhZCcgfSk7XG4gICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE5ld1dvcmtlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUFRocmVhZC51bnVzZWRXb3JrZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlcl8xID0gUFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcl8xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFRocmVhZC51bnVzZWRXb3JrZXJzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gUFRocmVhZC5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAgICAgICAgIFBUaHJlYWQubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3b3JrZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpaXBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X2xhc3RfZXJyb3IoZW52LCBlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZXJyb3JfY29kZSwgZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZV9yZXNlcnZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jbGVhcl9sYXN0X2Vycm9yKGVudikge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X25vZGVfdmVyc2lvbihtYWpvciwgbWlub3IsIHBhdGNoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmVyc2lvbnMgPSAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy52ZXJzaW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgID8gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uIChuKSB7IHJldHVybiBOdW1iZXIobik7IH0pXG4gICAgICAgICAgICAgICAgOiBbMCwgMCwgMF07XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKG1ham9yLCB2ZXJzaW9uc1swXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIobWlub3IsIHZlcnNpb25zWzFdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihwYXRjaCwgdmVyc2lvbnNbMl0sIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKiBAX19kZXBzICRydW50aW1lS2VlcGFsaXZlUHVzaFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wdXNoKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKiBAX19kZXBzICRydW50aW1lS2VlcGFsaXZlUG9wXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3BvcCgpIHtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9zZXRfaW1tZWRpYXRlKGNhbGxiYWNrLCBkYXRhKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9uZXh0X3RpY2soY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZpcHBwaVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZShmb3JjZVVuY2F1Z2h0LCBlbnYsIGNhbGxiYWNrLCBkYXRhLCBjbG9zZV9zY29wZV9pZl90aHJvdykge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZShCb29sZWFuKGZvcmNlVW5jYXVnaHQpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2Vfc2NvcGVfaWZfdGhyb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2aXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfY2FsbF9maW5hbGl6ZXIoZm9yY2VVbmNhdWdodCwgZW52LCBjYWxsYmFjaywgZGF0YSwgaGludCkge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jYWxsRmluYWxpemVySW50ZXJuYWwoZm9yY2VVbmNhdWdodCwgY2FsbGJhY2ssIGRhdGEsIGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jdHhfaW5jcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXIoKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguaW5jcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyKCkge1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gJGVtbmFwaVNldFZhbHVlSTY0KHJlc3VsdCwgbnVtYmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wRG91YmxlO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHRlbXBJNjQgPSBbXG4gICAgICAgICAgICAgICAgbnVtYmVyVmFsdWUgPj4+IDAsXG4gICAgICAgICAgICAgICAgKHRlbXBEb3VibGUgPSBudW1iZXJWYWx1ZSwgK01hdGguYWJzKHRlbXBEb3VibGUpID49IDEgPyB0ZW1wRG91YmxlID4gMCA/IChNYXRoLm1pbigrTWF0aC5mbG9vcih0ZW1wRG91YmxlIC8gNDI5NDk2NzI5NiksIDQyOTQ5NjcyOTUpIHwgMCkgPj4+IDAgOiB+fitNYXRoLmNlaWwoKHRlbXBEb3VibGUgLSArKH5+dGVtcERvdWJsZSA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAgOiAwKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHRlbXBJNjRbMF0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgdGVtcEk2NFsxXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHV0aWxNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0OiAkZW1uYXBpU2V0VmFsdWVJNjQsXG4gICAgICAgICAgICBfZW1uYXBpX2NhbGxfZmluYWxpemVyOiBfZW1uYXBpX2NhbGxfZmluYWxpemVyLFxuICAgICAgICAgICAgX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZTogX2VtbmFwaV9jYWxsYmFja19pbnRvX21vZHVsZSxcbiAgICAgICAgICAgIF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyOiBfZW1uYXBpX2N0eF9kZWNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcixcbiAgICAgICAgICAgIF9lbW5hcGlfY3R4X2luY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyOiBfZW1uYXBpX2N0eF9pbmNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcixcbiAgICAgICAgICAgIF9lbW5hcGlfZ2V0X25vZGVfdmVyc2lvbjogX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uLFxuICAgICAgICAgICAgX2VtbmFwaV9uZXh0X3RpY2s6IF9lbW5hcGlfbmV4dF90aWNrLFxuICAgICAgICAgICAgX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wb3A6IF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcG9wLFxuICAgICAgICAgICAgX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wdXNoOiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2gsXG4gICAgICAgICAgICBfZW1uYXBpX3NldF9pbW1lZGlhdGU6IF9lbW5hcGlfc2V0X2ltbWVkaWF0ZSxcbiAgICAgICAgICAgIG5hcGlfY2xlYXJfbGFzdF9lcnJvcjogbmFwaV9jbGVhcl9sYXN0X2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9zZXRfbGFzdF9lcnJvcjogbmFwaV9zZXRfbGFzdF9lcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpR2V0V29ya2VyQnlQdGhyZWFkUHRyKHB0aHJlYWRQdHIpIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogd2FzaS1zZGstMjAuMCt0aHJlYWRzXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogc3RydWN0IHB0aHJlYWQge1xuICAgICAgICAgICAgICogICBzdHJ1Y3QgcHRocmVhZCAqc2VsZjsgICAgICAgIC8vIDBcbiAgICAgICAgICAgICAqICAgc3RydWN0IHB0aHJlYWQgKnByZXYsICpuZXh0OyAvLyA0LCA4XG4gICAgICAgICAgICAgKiAgIHVpbnRwdHJfdCBzeXNpbmZvOyAgICAgICAgICAgLy8gMTJcbiAgICAgICAgICAgICAqICAgdWludHB0cl90IGNhbmFyeTsgICAgICAgICAgICAvLyAxNlxuICAgICAgICAgICAgICogICBpbnQgdGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIDIwXG4gICAgICAgICAgICAgKiAgIC8vIC4uLlxuICAgICAgICAgICAgICogfVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgdGlkT2Zmc2V0ID0gMjA7XG4gICAgICAgICAgICB2YXIgdGlkID0gdmlldy5nZXRJbnQzMihwdGhyZWFkUHRyICsgdGlkT2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBQVGhyZWFkLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV93b3JrZXJfdW5yZWYocHRocmVhZFB0cikge1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IGVtbmFwaUdldFdvcmtlckJ5UHRocmVhZFB0cihwdGhyZWFkUHRyKTtcbiAgICAgICAgICAgIGlmICh3b3JrZXIgJiYgdHlwZW9mIHdvcmtlci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdmlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX3NlbmRfanModHlwZSwgY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzEgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlXzEoe1xuICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfc2V0X2ltbWVkaWF0ZShjYWxsYmFjaywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9uZXh0X3RpY2soY2FsbGJhY2ssIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZ1bmN0aW9uIHB0clRvU3RyaW5nIChwdHI6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vICAgcmV0dXJuICcweCcgKyAoJzAwMDAwMDAwJyArIHB0ci50b1N0cmluZygxNikpLnNsaWNlKC04KVxuICAgICAgICAvLyB9XG4gICAgICAgIHZhciB1dlRocmVhZHBvb2xSZWFkeVJlc29sdmU7XG4gICAgICAgIHZhciB1dlRocmVhZHBvb2xSZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICB1dlRocmVhZHBvb2xSZWFkeVJlc29sdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXZUaHJlYWRwb29sUmVhZHkucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB1dlRocmVhZHBvb2xSZWFkeS5yZWFkeSA9IGZhbHNlO1xuICAgICAgICAvKiogQF9fc2lnIGkgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9pc19tYWluX2Jyb3dzZXJfdGhyZWFkKCkge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFTlZJUk9OTUVOVF9JU19OT0RFKSA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBwaSAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeShjYWxsYmFjaywgcSwgdHlwZSkge1xuICAgICAgICAgICAgaWYgKHV2VGhyZWFkcG9vbFJlYWR5LnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShxLCB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKHEsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2wodGhyZWFkcywgc2l6ZSkge1xuICAgICAgICAgICAgdmFyIHAgPSBbXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHB0aHJlYWRQdHIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMih0aHJlYWRzICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciB3b3JrZXIgPSBlbW5hcGlHZXRXb3JrZXJCeVB0aHJlYWRQdHIocHRocmVhZFB0cik7XG4gICAgICAgICAgICAgICAgcC5wdXNoKG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2VtbmFwaV9fICYmIF9fZW1uYXBpX18udHlwZSA9PT0gJ2FzeW5jLXRocmVhZC1yZWFkeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB0eXBlb2Ygd29ya2VyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIub2ZmKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwKS50aGVuKHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2ICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHkoKSB7XG4gICAgICAgICAgICBpZiAoIUVOVklST05NRU5UX0lTX1BUSFJFQUQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhc3luYy10aHJlYWQtcmVhZHknLFxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhc3luY01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeTogX2VtbmFwaV9hZnRlcl91dnRocmVhZHBvb2xfcmVhZHksXG4gICAgICAgICAgICBfZW1uYXBpX2FzeW5jX3NlbmRfanM6IF9lbW5hcGlfYXN5bmNfc2VuZF9qcyxcbiAgICAgICAgICAgIF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHk6IF9lbW5hcGlfZW1pdF9hc3luY190aHJlYWRfcmVhZHksXG4gICAgICAgICAgICBfZW1uYXBpX2lzX21haW5fYnJvd3Nlcl90aHJlYWQ6IF9lbW5hcGlfaXNfbWFpbl9icm93c2VyX3RocmVhZCxcbiAgICAgICAgICAgIF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2w6IF9lbW5hcGlfdGVsbF9qc191dnRocmVhZHBvb2wsXG4gICAgICAgICAgICBfZW1uYXBpX3dvcmtlcl91bnJlZjogX2VtbmFwaV93b3JrZXJfdW5yZWZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbiAgICAgICAgLyoqIEBfX3NpZyBpcGpwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfYWRqdXN0X2V4dGVybmFsX21lbW9yeShlbnYsIGNoYW5nZV9pbl9ieXRlcywgYWRqdXN0ZWRfdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFhZGp1c3RlZF92YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGNoYW5nZV9pbl9ieXRlc19udW1iZXIgPSBOdW1iZXIoY2hhbmdlX2luX2J5dGVzKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VfaW5fYnl0ZXNfbnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb2xkX3NpemUgPSB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgdmFyIG5ld19zaXplID0gb2xkX3NpemUgKyBjaGFuZ2VfaW5fYnl0ZXNfbnVtYmVyO1xuICAgICAgICAgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSArICgoNjU1MzYgLSBuZXdfc2l6ZSAlIDY1NTM2KSAlIDY1NTM2KTtcbiAgICAgICAgICAgIGlmICh3YXNtTWVtb3J5Lmdyb3coKG5ld19zaXplIC0gb2xkX3NpemUgKyA2NTUzNSkgPj4gMTYpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEJpZ0ludDY0KGFkanVzdGVkX3ZhbHVlLCBCaWdJbnQod2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCksIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0KGFkanVzdGVkX3ZhbHVlLCB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWVtb3J5TW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfYWRqdXN0X2V4dGVybmFsX21lbW9yeTogbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5XG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpQVdTVC5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUFXU1QgPSB7XG4gICAgICAgICAgICBpZEdlbjoge30sXG4gICAgICAgICAgICB2YWx1ZXM6IFt1bmRlZmluZWRdLFxuICAgICAgICAgICAgcXVldWVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWRHZW4gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJZDogMSxcbiAgICAgICAgICAgICAgICAgICAgbGlzdDogW10sXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRHZW4ubGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGlkR2VuLmxpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaWRHZW4ubmV4dElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkR2VuLm5leHRJZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXVzZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZEdlbi5saXN0LnB1c2goaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmlkR2VuID0gaWRHZW47XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXMgPSBbdW5kZWZpbmVkXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnBlbmRpbmcgPSBbXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZU5hbWUsIGV4ZWN1dGUsIGNvbXBsZXRlLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0NvbnRleHQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmVtaXRBc3luY0luaXQocmVzb3VyY2UsIHJlc291cmNlTmFtZSwgLTEpO1xuICAgICAgICAgICAgICAgICAgICBhc3luY0lkID0gYXN5bmNDb250ZXh0LmFzeW5jSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkID0gYXN5bmNDb250ZXh0LnRyaWdnZXJBc3luY0lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaWQgPSBlbW5hcGlBV1NULmlkR2VuLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXNbaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBlbnY6IGVudixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZTogcmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyQXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAwLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBleGVjdXRlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogY29tcGxldGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWxsQ29tcGxldGU6IGZ1bmN0aW9uICh3b3JrLCBzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbXBsZXRlID0gd29yay5jb21wbGV0ZTtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gd29yay5lbnY7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB3b3JrLmRhdGE7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBsZXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2NvcGUgPSBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbGJhY2tJbnRvTW9kdWxlKHRydWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayh3b3JrLnJlc291cmNlLCBjYWxsYmFjaywgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IHdvcmsuYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB3b3JrLnRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcXVldWU6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdTVC52YWx1ZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrLnN0YXR1cyA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlBV1NULnF1ZXVlZC5zaXplID49IChNYXRoLmFicyhlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSkgfHwgNCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZC5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52XzEgPSB3b3JrLmVudjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFfMSA9IHdvcmsuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXhlY3V0ZSA9IHdvcmsuZXhlY3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgd29yay5zdGF0dXMgPSAyO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoZXhlY3V0ZSkpKGVudl8xLCBkYXRhXzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5xdWV1ZWQuZGVsZXRlKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuc3RhdHVzID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5jYWxsQ29tcGxldGUod29yaywgMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUFXU1QucGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRXb3JrSWQgPSBlbW5hcGlBV1NULnBlbmRpbmcuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tuZXh0V29ya0lkXS5zdGF0dXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWUobmV4dFdvcmtJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGVtbmFwaUFXU1QucGVuZGluZy5pbmRleE9mKGlkKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrXzEgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh3b3JrXzEgJiYgKHdvcmtfMS5zdGF0dXMgPT09IDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrXzEuc3RhdHVzID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmNhbGxDb21wbGV0ZSh3b3JrXzEsIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmsgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jRGVzdHJveSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luY0lkOiB3b3JrLmFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogd29yay50cmlnZ2VyQXN5bmNJZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC52YWx1ZXNbaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuaWRHZW4ucmV1c2UoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIHZwcGRwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQoYXN5bmNfcmVzb3VyY2UsIGFzeW5jX3Jlc291cmNlX25hbWUsIHRyaWdnZXJfYXN5bmNfaWQsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZV9uYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBhc3luY0NvbnRleHQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmVtaXRBc3luY0luaXQocmVzb3VyY2UsIHJlc291cmNlX25hbWUsIHRyaWdnZXJfYXN5bmNfaWQpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSBhc3luY0NvbnRleHQuYXN5bmNJZDtcbiAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IGFzeW5jQ29udGV4dC50cmlnZ2VyQXN5bmNJZDtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCBhc3luY0lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRGbG9hdDY0KHJlc3VsdCArIDgsIHRyaWdnZXJBc3luY0lkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZkZCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19kZXN0cm95KGFzeW5jX2lkLCB0cmlnZ2VyX2FzeW5jX2lkKSB7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jRGVzdHJveSh7XG4gICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qIHZwZGRwIGV4cG9ydCBmdW5jdGlvbiBfZW1uYXBpX25vZGVfb3Blbl9jYWxsYmFja19zY29wZSAoYXN5bmNfcmVzb3VyY2U6IG5hcGlfdmFsdWUsIGFzeW5jX2lkOiBkb3VibGUsIHRyaWdnZXJfYXN5bmNfaWQ6IGRvdWJsZSwgcmVzdWx0OiBQb2ludGVyPGludDY0X3Q+KTogdm9pZCB7XG4gICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZyB8fCAhcmVzdWx0KSByZXR1cm5cbiAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpIS52YWx1ZVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjb25zdCBuYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlciA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUub3BlbkNhbGxiYWNrU2NvcGUocmVzb3VyY2UsIHtcbiAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jX2lkLFxuICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICB9KVxuICAgIFxuICAgICAgICAgIGZyb202NCgncmVzdWx0JylcbiAgICAgICAgICAkX1RPRE9fbWFrZVNldFZhbHVlKCdyZXN1bHQnLCAwLCAnbmF0aXZlQ2FsbGJhY2tTY29wZVBvaW50ZXInLCAnaTY0JylcbiAgICAgICAgfVxuICAgIFxuICAgICAgICB2cFxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gX2VtbmFwaV9ub2RlX2Nsb3NlX2NhbGxiYWNrX3Njb3BlIChzY29wZTogUG9pbnRlcjxpbnQ2NF90Pik6IHZvaWQge1xuICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcgfHwgIXNjb3BlKSByZXR1cm5cbiAgICAgICAgICBmcm9tNjQoJ3Njb3BlJylcbiAgICAgICAgICBjb25zdCBuYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlciA9ICRfVE9ET19tYWtlR2V0VmFsdWUoJ3Njb3BlJywgMCwgJ2k2NCcpXG4gICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5jbG9zZUNhbGxiYWNrU2NvcGUoQmlnSW50KG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyKSlcbiAgICAgICAgfSAqL1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcGRkcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25vZGVfbWFrZV9jYWxsYmFjayhlbnYsIGFzeW5jX3Jlc291cmNlLCBjYiwgYXJndiwgc2l6ZSwgYXN5bmNfaWQsIHRyaWdnZXJfYXN5bmNfaWQsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjYikudmFsdWU7XG4gICAgICAgICAgICBzaXplID0gc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheShzaXplKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGFycltpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJnVmFsKS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZSwgY2FsbGJhY2ssIGFyciwge1xuICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jX2lkLFxuICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyX2FzeW5jX2lkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY19pbml0X2pzKGFzeW5jX3Jlc291cmNlLCBhc3luY19yZXNvdXJjZV9uYW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvdXJjZTtcbiAgICAgICAgICAgIGlmIChhc3luY19yZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHJlc291cmNlID0gT2JqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBuYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5uYXBpLmFzeW5jSW5pdChyZXNvdXJjZSwgbmFtZSk7XG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnN0YXR1cztcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IHJldC52YWx1ZTtcbiAgICAgICAgICAgIGlmICghKChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KC0xKSAqIChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSAmJiAobnVtYmVyVmFsdWUgPCAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSkpIHtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBsb3csIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY19kZXN0cm95X2pzKGFzeW5jX2NvbnRleHQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICB2YXIgbG93ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB2YXIgaGlnaCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciBwb2ludGVyID0gQmlnSW50KGxvdyA+Pj4gMCkgfCAoQmlnSW50KGhpZ2gpIDw8IEJpZ0ludCgzMikpO1xuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuYXN5bmNEZXN0cm95KHBvaW50ZXIpO1xuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgIT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldC5zdGF0dXM7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS1hZGRvbi1hcGkvcHVsbC8xMjgzXG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9vcGVuX2NhbGxiYWNrX3Njb3BlKGVudiwgaWdub3JlZCwgYXN5bmNfY29udGV4dF9oYW5kbGUsIHJlc3VsdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpX29wZW5fY2FsbGJhY2tfc2NvcGUgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfY2FsbGJhY2tfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfbWFrZV9jYWxsYmFjayhlbnYsIGFzeW5jX2NvbnRleHQsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZWN2KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdjhyZWN2ID0gT2JqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVjdikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhciB2OGZ1bmMgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGZ1bmMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdjhmdW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIGxvdyA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSBCaWdJbnQobG93ID4+PiAwKSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IEFycmF5KGFyZ2MpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhcnJbaV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZXQgPSBlbW5hcGlOb2RlQmluZGluZy5uYXBpLm1ha2VDYWxsYmFjayhjdHgsIHY4cmVjdiwgdjhmdW5jLCBhcnIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmV0LmVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihyZXQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9lbnZfY2hlY2tfZ2NfYWNjZXNzKGVudikge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGVNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9hc3luY19kZXN0cm95X2pzOiBfZW1uYXBpX2FzeW5jX2Rlc3Ryb3lfanMsXG4gICAgICAgICAgICBfZW1uYXBpX2FzeW5jX2luaXRfanM6IF9lbW5hcGlfYXN5bmNfaW5pdF9qcyxcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzczogX2VtbmFwaV9lbnZfY2hlY2tfZ2NfYWNjZXNzLFxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveTogX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveSxcbiAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQ6IF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQsXG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfbWFrZV9jYWxsYmFjazogX2VtbmFwaV9ub2RlX21ha2VfY2FsbGJhY2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlOiBuYXBpX2Nsb3NlX2NhbGxiYWNrX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9tYWtlX2NhbGxiYWNrOiBuYXBpX21ha2VfY2FsbGJhY2ssXG4gICAgICAgICAgICBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGU6IG5hcGlfb3Blbl9jYWxsYmFja19zY29wZVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlUU0ZOLmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpVFNGTiA9IHtcbiAgICAgICAgICAgIG9mZnNldDoge1xuICAgICAgICAgICAgICAgIC8qIG5hcGlfcmVmICovIHJlc291cmNlOiAwLFxuICAgICAgICAgICAgICAgIC8qIGRvdWJsZSAqLyBhc3luY19pZDogOCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gdHJpZ2dlcl9hc3luY19pZDogMTYsXG4gICAgICAgICAgICAgICAgLyogc2l6ZV90ICovIHF1ZXVlX3NpemU6IDI0LFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIHF1ZXVlOiAxICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyB0aHJlYWRfY291bnQ6IDIgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogYm9vbCAqLyBpc19jbG9zaW5nOiAzICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIGF0b21pY191Y2hhciAqLyBkaXNwYXRjaF9zdGF0ZTogMyAqIDQgKyAyOCxcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBjb250ZXh0OiAzICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyBtYXhfcXVldWVfc2l6ZTogNCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZWY6IDUgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9lbnYgKi8gZW52OiA2ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIGZpbmFsaXplX2RhdGE6IDcgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9maW5hbGl6ZSAqLyBmaW5hbGl6ZV9jYjogOCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3RocmVhZHNhZmVfZnVuY3Rpb25fY2FsbF9qcyAqLyBjYWxsX2pzX2NiOiA5ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIGJvb2wgKi8gaGFuZGxlc19jbG9zaW5nOiAxMCAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBib29sICovIGFzeW5jX3JlZjogMTAgKiA0ICsgMzYsXG4gICAgICAgICAgICAgICAgLyogaW50MzJfdCAqLyBtdXRleDogMTAgKiA0ICsgNDAsXG4gICAgICAgICAgICAgICAgLyogaW50MzJfdCAqLyBjb25kOiAxMCAqIDQgKyA0NCxcbiAgICAgICAgICAgICAgICBlbmQ6IDEwICogNCArIDQ4XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgUFRocmVhZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC51bnVzZWRXb3JrZXJzLmZvckVhY2goZW1uYXBpVFNGTi5hZGRMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQucnVubmluZ1dvcmtlcnMuZm9yRWFjaChlbW5hcGlUU0ZOLmFkZExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9fb3JpZ2luYWxfZ2V0TmV3V29ya2VyXzEgPSBQVGhyZWFkLmdldE5ld1dvcmtlcjtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5nZXROZXdXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9fb3JpZ2luYWxfZ2V0TmV3V29ya2VyXzEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIocik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXIuX2VtbmFwaVRTRk5MaXN0ZW5lcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEVOVklST05NRU5UX0lTX05PREUgPyBlIDogZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBfX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RzZm4tc2VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRpc3BhdGNoKHBheWxvYWQudHNmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBkaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpVFNGTkxpc3RlbmVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd29ya2VyLl9lbW5hcGlUU0ZOTGlzdGVuZXIgPSB7IGhhbmRsZXI6IGhhbmRsZXIsIGRpc3Bvc2U6IGRpc3Bvc2UgfTtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSAyICogNDtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgIGlmICghcXVldWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgcXVldWUsIHNpemUpLmZpbGwoMCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlLCBxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3lRdWV1ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChxdWV1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfZnJlZShxdWV1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1c2hRdWV1ZTogZnVuY3Rpb24gKGZ1bmMsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciB0YWlsID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSAyICogNDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IF9tYWxsb2Moc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09PTScpO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKG5vZGUsIGRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShub2RlICsgNCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkID09PSAwICYmIHRhaWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZSh0YWlsICsgNCwgbm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5hZGRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2hpZnRRdWV1ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHZhciBoZWFkID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShxdWV1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGhlYWQ7XG4gICAgICAgICAgICAgICAgdmFyIG5leHQgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGhlYWQgKyA0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUsIG5leHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShxdWV1ZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUobm9kZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBfZnJlZShub2RlKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlF1ZXVlU2l6ZShmdW5jKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGZ1bmMsIGRhdGEsIG1vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBjb25kID0gZW1uYXBpVFNGTi5nZXRDb25kKGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciB3YWl0Q29uZGl0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcXVldWVTaXplID0gZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhTaXplID0gZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmcgPSBlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlU2l6ZSA+PSBtYXhTaXplICYmIG1heFNpemUgPiAwICYmICFpc0Nsb3Npbmc7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgaXNCcm93c2VyTWFpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4LmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2FpdENvbmRpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gMCAvKiBuYXBpX3RocmVhZHNhZmVfZnVuY3Rpb25fY2FsbF9tb2RlLm5hcGlfdHNmbl9ub25ibG9ja2luZyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNSAvKiBuYXBpX3N0YXR1cy5uYXBpX3F1ZXVlX2Z1bGwgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEJyb3dzZXIgSlMgbWFpbiB0aHJlYWQgY2FuIG5vdCB1c2UgYEF0b21pY3Mud2FpdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxhdGVkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzI2ODlcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMzNDUzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXJNYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIxIC8qIG5hcGlfc3RhdHVzLm5hcGlfd291bGRfZGVhZGxvY2sgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kLndhaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRJc0Nsb3NpbmcoZnVuYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3ViVGhyZWFkQ291bnQoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE2IC8qIG5hcGlfc3RhdHVzLm5hcGlfY2xvc2luZyAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4ucHVzaFF1ZXVlKGZ1bmMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZW5kKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE11dGV4OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5tdXRleDtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0Jyb3dzZXJNYWluID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiAhRU5WSVJPTk1FTlRfSVNfTk9ERTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jyb3dzZXJNYWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8qIGxvY2tBc3luYyAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWdhaW4gPSAoKTogdm9pZCA9PiB7IGZuKCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gQXRvbWljcy5jb21wYXJlRXhjaGFuZ2UoaTMyYSwgMCwgMCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKEF0b21pY3MgYXMgYW55KS53YWl0QXN5bmMoaTMyYSwgMCwgMSkudmFsdWUudGhlbihhZ2FpbilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZuKClcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LCAqL1xuICAgICAgICAgICAgICAgICAgICB1bmxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDEsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byB1bmxvY2sgd2hpbGUgbm90IGhvbGRpbmcgdGhlIG11dGV4Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZTogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgudW5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLyogLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlQXN5bmM8VD4gKGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4LmxvY2tBc3luYygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gclxuICAgICAgICAgICAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9ICovXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbXV0ZXg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0Q29uZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuY29uZDtcbiAgICAgICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBjb25kID0ge1xuICAgICAgICAgICAgICAgICAgICB3YWl0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBBdG9taWNzLmxvYWQoaTMyYSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mud2FpdChpMzJhLCAwLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIC8qIHdhaXRBc3luYyAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSlcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IEF0b21pY3MubG9hZChpMzJhLCAwKVxuICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jayA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IG11dGV4LmxvY2tBc3luYygpXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQXRvbWljcyBhcyBhbnkpLndhaXRBc3luYyhpMzJhLCAwLCB2YWx1ZSkudmFsdWUudGhlbihsb2NrLCBsb2NrKVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgKi9cbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLmFkZChpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KGkzMmEsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlX3NpemUsIHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFkZFF1ZXVlU2l6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQucXVldWVfc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3ViUXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZV9zaXplO1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN1YihhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50O1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLmFkZChhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJUaHJlYWRDb3VudDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50O1xuICAgICAgICAgICAgICAgIHZhciBhcnIsIGluZGV4O1xuICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaW5kZXggPSAoZnVuYyArIG9mZnNldCkgPj4gMjtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN1YihhcnIsIGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRJc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaXNfY2xvc2luZykgPj4gMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0SXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYywgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKSwgKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5pc19jbG9zaW5nKSA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0SGFuZGxlc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaGFuZGxlc19jbG9zaW5nKSA+PiAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXRIYW5kbGVzQ2xvc2luZzogZnVuY3Rpb24gKGZ1bmMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaGFuZGxlc19jbG9zaW5nKSA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RGlzcGF0Y2hTdGF0ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQXRvbWljcy5sb2FkKG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRNYXhRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0Lm1heF9xdWV1ZV9zaXplLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENhbGxKU0NiOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5jYWxsX2pzX2NiLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVmOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5yZWYsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRSZXNvdXJjZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucmVzb3VyY2UsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRGaW5hbGl6ZUNiOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5maW5hbGl6ZV9jYiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEZpbmFsaXplRGF0YTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRTaXplVHlwZVZhbHVlOiBmdW5jdGlvbiAob2Zmc2V0LCB1bnNpZ25lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXQ7XG4gICAgICAgICAgICAgICAgdmFyIGFycjtcbiAgICAgICAgICAgICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQXRvbWljcy5sb2FkKGFyciwgb2Zmc2V0ID4+IDIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBBdG9taWNzLmxvYWQoYXJyLCBvZmZzZXQgPj4gMik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0b3JlU2l6ZVR5cGVWYWx1ZTogZnVuY3Rpb24gKG9mZnNldCwgdmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFycjtcbiAgICAgICAgICAgICAgICBpZiAodW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShhcnIsIG9mZnNldCA+PiAyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBvZmZzZXQgPj4gMiwgdmFsdWUgPj4+IDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGVzdHJveVF1ZXVlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnYgPSBlbW5hcGlUU0ZOLmdldEVudihmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlUU0ZOLmdldFJlZihmdW5jKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVmKS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZW1vdmVDbGVhbnVwSG9vayhlbnZPYmplY3QsIGVtbmFwaVRTRk4uY2xlYW51cCwgZnVuYyk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoQXRvbWljcy5sb2FkKGFyciwgYXN5bmNSZWZPZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZ2dlckFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRyaWdnZXJfYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19kZXN0cm95KGFzeW5jSWQsIHRyaWdnZXJBc3luY0lkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2ZyZWUoZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW1wdHlRdWV1ZUFuZERlbGV0ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbEpzQ2IgPSBlbW5hcGlUU0ZOLmdldENhbGxKU0NiKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGVtbmFwaVRTRk4uc2hpZnRRdWV1ZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxKc0NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsSnNDYikpKDAsIDAsIGNvbnRleHQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGVzdHJveShmdW5jKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGZpbmFsaXplID0gZW1uYXBpVFNGTi5nZXRGaW5hbGl6ZUNiKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGVtbmFwaVRTRk4uZ2V0RmluYWxpemVEYXRhKGZ1bmMpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgwLCBmaW5hbGl6ZSwgZGF0YSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaVRTRk4uZ2V0UmVzb3VyY2UoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlX3ZhbHVlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvdXJjZV92YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC50cmlnZ2VyX2FzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgZiwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5lbXB0eVF1ZXVlQW5kRGVsZXRlKGZ1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYW51cDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlKGZ1bmMsIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlOiBmdW5jdGlvbiAoZnVuYywgc2V0X2Nsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldF9jbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpLmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SXNDbG9zaW5nKGZ1bmMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldE1heFF1ZXVlU2l6ZShmdW5jKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5nZXRDb25kKGZ1bmMpLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldEhhbmRsZXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRIYW5kbGVzQ2xvc2luZyhmdW5jLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZmluYWxpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2hPbmU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgcG9wcGVkX3ZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIGhhc19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgICAgICBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmNsb3NlSGFuZGxlc0FuZE1heWJlRGVsZXRlKGZ1bmMsIDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSBlbW5hcGlUU0ZOLmdldFF1ZXVlU2l6ZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbW5hcGlUU0ZOLnNoaWZ0UXVldWUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wcGVkX3ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF4UXVldWVTaXplID0gZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT09IG1heFF1ZXVlU2l6ZSAmJiBtYXhRdWV1ZVNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0VGhyZWFkQ291bnQoZnVuYykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRJc0Nsb3NpbmcoZnVuYywgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldE1heFF1ZXVlU2l6ZShmdW5jKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocG9wcGVkX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnYgPSBlbW5hcGlUU0ZOLmdldEVudihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdF8xID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdF8xKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3RfMS5jYWxsYmFja0ludG9Nb2R1bGUoZmFsc2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEpzQ2IgPSBlbW5hcGlUU0ZOLmdldENhbGxKU0NiKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlUU0ZOLmdldFJlZihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIganNfY2FsbGJhY2sgPSByZWYgPyBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikuZ2V0KCkgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSnNDYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gZW1uYXBpVFNGTi5nZXRDb250ZXh0KGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsSnNDYikpKGVudiwganNfY2FsbGJhY2ssIGNvbnRleHQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzQ2FsbGJhY2sgPSBqc19jYWxsYmFjayA/IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoanNfY2FsbGJhY2spLnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc0NhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc0NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaVRTRk4uZ2V0UmVzb3VyY2UoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlX3ZhbHVlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvdXJjZV92YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHJlc291cmNlT2JqZWN0LCBmLCBbXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY0lkOiB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdF8xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFzX21vcmU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlzcGF0Y2g6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhc19tb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0aW9uc19sZWZ0ID0gMTAwMDtcbiAgICAgICAgICAgICAgICB2YXIgdWkzMmEgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDI7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGhhc19tb3JlICYmIC0taXRlcmF0aW9uc19sZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUodWkzMmEsIGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSBlbW5hcGlUU0ZOLmRpc3BhdGNoT25lKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXRvbWljcy5leGNoYW5nZSh1aTMyYSwgaW5kZXgsIDApICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhhc19tb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudF9zdGF0ZSA9IEF0b21pY3Mub3IobmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKSwgKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5kaXNwYXRjaF9zdGF0ZSkgPj4gMiwgMSA8PCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRfc3RhdGUgJiAxKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIEVOVklST05NRU5UX0lTX1BUSFJFQUQgIT09ICd1bmRlZmluZWQnKSAmJiBFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndHNmbi1zZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZm46IGZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZGlzcGF0Y2goZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdGhyZWFkc2FmZV9mdW5jdGlvbihlbnYsIGZ1bmMsIGFzeW5jX3Jlc291cmNlLCBhc3luY19yZXNvdXJjZV9uYW1lLCBtYXhfcXVldWVfc2l6ZSwgaW5pdGlhbF90aHJlYWRfY291bnQsIHRocmVhZF9maW5hbGl6ZV9kYXRhLCB0aHJlYWRfZmluYWxpemVfY2IsIGNvbnRleHQsIGNhbGxfanNfY2IsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFhc3luY19yZXNvdXJjZV9uYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBtYXhfcXVldWVfc2l6ZSA9IG1heF9xdWV1ZV9zaXplID4+PiAwO1xuICAgICAgICAgICAgaW5pdGlhbF90aHJlYWRfY291bnQgPSBpbml0aWFsX3RocmVhZF9jb3VudCA+Pj4gMDtcbiAgICAgICAgICAgIGlmIChpbml0aWFsX3RocmVhZF9jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHJlZiA9IDA7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxfanNfY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnVuY1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmNWYWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgcmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGZ1bmMsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLykuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXN5bmNSZXNvdXJjZU9iamVjdDtcbiAgICAgICAgICAgIGlmIChhc3luY19yZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGFzeW5jUmVzb3VyY2VPYmplY3QgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoYXN5bmNSZXNvdXJjZU9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhc3luY1Jlc291cmNlT2JqZWN0ID0gT2JqZWN0KGFzeW5jUmVzb3VyY2VPYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGFzeW5jUmVzb3VyY2VPYmplY3QpO1xuICAgICAgICAgICAgdmFyIGFzeW5jUmVzb3VyY2VOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZV9uYW1lKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNSZXNvdXJjZU5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3luY1Jlc291cmNlTmFtZSA9IFN0cmluZyhhc3luY1Jlc291cmNlTmFtZSk7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VfbmFtZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChhc3luY1Jlc291cmNlTmFtZSk7XG4gICAgICAgICAgICAvLyB0c2ZuIGNyZWF0ZVxuICAgICAgICAgICAgdmFyIHNpemVvZlRTRk4gPSBlbW5hcGlUU0ZOLm9mZnNldC5lbmQ7XG4gICAgICAgICAgICB2YXIgdHNmbiA9IF9tYWxsb2Moc2l6ZW9mVFNGTik7XG4gICAgICAgICAgICBpZiAoIXRzZm4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkodHNmbiwgdHNmbiArIHNpemVvZlRTRk4pLmZpbGwoMCk7XG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VSZWYgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgcmVzb3VyY2UsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVzb3VyY2VfID0gcmVzb3VyY2VSZWYuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiwgcmVzb3VyY2VfLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpVFNGTi5pbml0UXVldWUodHNmbikpIHtcbiAgICAgICAgICAgICAgICBfZnJlZSh0c2ZuKTtcbiAgICAgICAgICAgICAgICByZXNvdXJjZVJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0KHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCAtMSwgdHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQudGhyZWFkX2NvdW50LCBpbml0aWFsX3RocmVhZF9jb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuY29udGV4dCwgY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0Lm1heF9xdWV1ZV9zaXplLCBtYXhfcXVldWVfc2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQucmVmLCByZWYsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmVudiwgZW52LCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5maW5hbGl6ZV9kYXRhLCB0aHJlYWRfZmluYWxpemVfZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfY2IsIHRocmVhZF9maW5hbGl6ZV9jYiwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuY2FsbF9qc19jYiwgY2FsbF9qc19jYiwgdHJ1ZSk7XG4gICAgICAgICAgICBlbW5hcGlDdHguYWRkQ2xlYW51cEhvb2soZW52T2JqZWN0LCBlbW5hcGlUU0ZOLmNsZWFudXAsIHRzZm4pO1xuICAgICAgICAgICAgZW52T2JqZWN0LnJlZigpO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmluY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmLCAxLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdHNmbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdGhyZWFkc2FmZV9mdW5jdGlvbl9jb250ZXh0KGZ1bmMsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFmdW5jIHx8ICFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGkgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb24oZnVuYywgZGF0YSwgbW9kZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ucHVzaChmdW5jLCBkYXRhLCBtb2RlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfYWNxdWlyZV90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICByZXR1cm4gbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNiAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nsb3NpbmcgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkVGhyZWFkQ291bnQoZnVuYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBpICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVsZWFzZV90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMsIG1vZGUpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgIHJldHVybiBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwIHx8IG1vZGUgPT09IDEgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX3JlbGVhc2VfbW9kZS5uYXBpX3RzZm5fYWJvcnQgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ2xvc2luZyA9IGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2xvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzQ2xvc2luZ1ZhbHVlID0gKG1vZGUgPT09IDEgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX3JlbGVhc2VfbW9kZS5uYXBpX3RzZm5fYWJvcnQgKi8pID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNldElzQ2xvc2luZyhmdW5jLCBpc0Nsb3NpbmdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbG9zaW5nVmFsdWUgJiYgZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZC5zaWduYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uKGVudiwgZnVuYykge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKEF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmX3RocmVhZHNhZmVfZnVuY3Rpb24oZW52LCBmdW5jKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYXN5bmNSZWZPZmZzZXQgPSAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX3JlZikgPj4gMjtcbiAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIUF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBhc3luY1JlZk9mZnNldCwgMSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmluY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbW5hcGlBV01UID0ge1xuICAgICAgICAgICAgdW51c2VkV29ya2VyczogW10sXG4gICAgICAgICAgICBydW5uaW5nV29ya2VyczogW10sXG4gICAgICAgICAgICB3b3JrUXVldWU6IFtdLFxuICAgICAgICAgICAgd29ya2VyUmVhZHk6IG51bGwsXG4gICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZXNvdXJjZTogMCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gYXN5bmNfaWQ6IDgsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIHRyaWdnZXJfYXN5bmNfaWQ6IDE2LFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZW52ICovIGVudjogMjQsXG4gICAgICAgICAgICAgICAgLyogdm9pZCogKi8gZGF0YTogMSAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2FzeW5jX2V4ZWN1dGVfY2FsbGJhY2sgKi8gZXhlY3V0ZTogMiAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2FzeW5jX2NvbXBsZXRlX2NhbGxiYWNrICovIGNvbXBsZXRlOiAzICogNCArIDI0LFxuICAgICAgICAgICAgICAgIGVuZDogNCAqIDQgKyAyNFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnVudXNlZFdvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5ID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICAgICAgICAgIGlmICghd29ya2VyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gRU5WSVJPTk1FTlRfSVNfTk9ERSA/IGUgOiBlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfX2VtbmFwaV9fID0gZGF0YS5fX2VtbmFwaV9fO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBfX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IF9fZW1uYXBpX18ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzLnNwbGljZShlbW5hcGlBV01ULnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHBheWxvYWQud29yaywgMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdhc3luYy13b3JrLXF1ZXVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHBheWxvYWQud29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1jYW5jZWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jYW5jZWxXb3JrKHBheWxvYWQud29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBkaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9mZignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd29ya2VyLl9lbW5hcGlBV01UTGlzdGVuZXIgPSB7IGhhbmRsZXI6IGhhbmRsZXIsIGRpc3Bvc2U6IGRpc3Bvc2UgfTtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub24oJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0V29ya2VyczogZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUFXTVQud29ya2VyUmVhZHkgfHwgKGVtbmFwaUFXTVQud29ya2VyUmVhZHkgPSBQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlBV01ULndvcmtlclJlYWR5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uQ3JlYXRlV29ya2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmICghKCdlbW5hcGlfYXN5bmNfd29ya2VyX2NyZWF0ZScgaW4gd2FzbUluc3RhbmNlLmV4cG9ydHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BlbW5hcGlfYXN5bmNfd29ya2VyX2NyZWF0ZWAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGVgIHRvIGxpbmtlciBmbGFncycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2god2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3b3JrZXIgPSBvbkNyZWF0ZVdvcmtlcih7IHR5cGU6ICdhc3luYy13b3JrJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmFkZExpc3RlbmVyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRocmVhZEJsb2NrQmFzZSA9IGFyZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29ya2VyLWluaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFyZzogYXJnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZnJlZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja0lkbGVXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLmxlbmd0aCA+IDAgJiYgZW1uYXBpQVdNVC53b3JrUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdNVC53b3JrUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstZXhlY3V0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyB3b3JrOiB3b3JrIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc291cmNlOiBmdW5jdGlvbiAod29yaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5yZXNvdXJjZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEV4ZWN1dGU6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmV4ZWN1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZSh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQuY29tcGxldGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2hlZHVsZVdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlLnB1c2god29yayk7XG4gICAgICAgICAgICAgICAgaWYgKChfYSA9IGVtbmFwaUFXTVQud29ya2VyUmVhZHkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuaW5pdFdvcmtlcnMoX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5LnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbFdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzIgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBlbW5hcGlBV01ULndvcmtRdWV1ZS5pbmRleE9mKHdvcmspO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHdvcmssIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZSA9IGVtbmFwaUFXTVQuZ2V0Q29tcGxldGUod29yayk7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZW1uYXBpQVdNVC5nZXREYXRhKHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZSh0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VfdmFsdWUgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgY2FsbGJhY2ssIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIHZhciBuYXBpX2NyZWF0ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlTmFtZSA9IFN0cmluZyhlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlX25hbWUpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gZW1uYXBpQVdTVC5jcmVhdGUoZW52LCByZXNvdXJjZU9iamVjdCwgcmVzb3VyY2VOYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVvZkFXID0gZW1uYXBpQVdNVC5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgICAgIHZhciBhdyA9IF9tYWxsb2Moc2l6ZW9mQVcpO1xuICAgICAgICAgICAgICAgIGlmICghYXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShhdywgYXcgKyBzaXplb2ZBVykuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXNvdXJjZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHMsIDEsIDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV8gPSByZXNvdXJjZVJlZi5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3LCByZXNvdXJjZV8sIHRydWUpO1xuICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQocywgcmVzb3VyY2VfbmFtZSwgLTEsIGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuYXN5bmNfaWQpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZW52LCBlbnYsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZXhlY3V0ZSwgZXhlY3V0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXcgKyBlbW5hcGlBV01ULm9mZnNldC5jb21wbGV0ZSwgY29tcGxldGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZGF0YSwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBhdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgdmFyIG5hcGlfZGVsZXRlX2FzeW5jX3dvcmsgPSBzaW5nbGVUaHJlYWRBc3luY1dvcmtcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucmVtb3ZlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNJZCwgdHJpZ2dlckFzeW5jSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZSh3b3JrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICB2YXIgbmFwaV9xdWV1ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIHZhciBuYXBpX2NhbmNlbF9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gZW1uYXBpQVdTVC5jYW5jZWwod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlbW5hcGlBV01ULmNhbmNlbFdvcmsod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGluaXRXb3JrZXIoc3RhcnRBcmcpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YXNtSW5zdGFuY2UuZXhwb3J0cy5lbW5hcGlfYXN5bmNfd29ya2VyX2luaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGVtbmFwaV9hc3luY193b3JrZXJfaW5pdGAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0YCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0KHN0YXJ0QXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnRUaHJlYWQgaXMgb25seSBhdmFpbGFibGUgaW4gY2hpbGQgdGhyZWFkcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY1dvcmsod29yaykge1xuICAgICAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBleGVjdXRlID0gZW1uYXBpQVdNVC5nZXRFeGVjdXRlKHdvcmspO1xuICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlBV01ULmdldERhdGEod29yayk7XG4gICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbml0V29ya2VyID0gaW5pdFdvcmtlcjtcbiAgICAgICAgbmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrID0gZXhlY3V0ZUFzeW5jV29yaztcbiAgICAgICAgdmFyIGFzeW5jV29ya01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbmNlbF9hc3luY193b3JrOiBuYXBpX2NhbmNlbF9hc3luY193b3JrLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXN5bmNfd29yazogbmFwaV9jcmVhdGVfYXN5bmNfd29yayxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2FzeW5jX3dvcms6IG5hcGlfZGVsZXRlX2FzeW5jX3dvcmssXG4gICAgICAgICAgICBuYXBpX3F1ZXVlX2FzeW5jX3dvcms6IG5hcGlfcXVldWVfYXN5bmNfd29ya1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUV4dGVybmFsTWVtb3J5ID0ge1xuICAgICAgICAgICAgcmVnaXN0cnk6IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRhYmxlOiBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgICAgd2FzbU1lbW9yeVZpZXdUYWJsZTogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA9IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNEZXRhY2hlZEFycmF5QnVmZmVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0QXJyYXlCdWZmZXJQb2ludGVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIsIHNob3VsZENvcHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8sXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpc0RldGFjaGVkID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkudGFibGUuaGFzKGFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkSW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLmdldChhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRJbmZvLmFkZHJlc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZENvcHkgJiYgY2FjaGVkSW5mby5vd25lcnNoaXAgPT09IDAgLyogT3duZXJzaGlwLmtSdW50aW1lICovICYmIGNhY2hlZEluZm8ucnVudGltZUFsbG9jYXRlZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksIGNhY2hlZEluZm8uYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkIHx8IChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IF9tYWxsb2MoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgaW5mby5hZGRyZXNzID0gcG9pbnRlcjtcbiAgICAgICAgICAgICAgICBpbmZvLm93bmVyc2hpcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICAgICAgaW5mby5ydW50aW1lQWxsb2NhdGVkID0gMTtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZS5zZXQoYXJyYXlCdWZmZXIsIGluZm8pO1xuICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIoYXJyYXlCdWZmZXIsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE9yVXBkYXRlTWVtb3J5VmlldzogZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiB2aWV3LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHZpZXcuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHZpZXcgaW5zdGFuY2VvZiBEYXRhVmlldyA/IHZpZXcuYnl0ZUxlbmd0aCA6IHZpZXcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPbGRXYXNtTWVtb3J5ID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiYgKHZpZXcuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVPbGRXYXNtTWVtb3J5ICYmIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBDdG9yID0gaW5mby5DdG9yO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJ1ZmZlciA9IGVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgQ3RvciA9PT0gQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIGluZm8uYWRkcmVzcywgaW5mby5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmlldyA9IG5ldyBDdG9yKHdhc21NZW1vcnkuYnVmZmVyLCBpbmZvLmFkZHJlc3MsIGluZm8ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLnNldChuZXdWaWV3LCBpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZpZXc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFZpZXdQb2ludGVyOiBmdW5jdGlvbiAodmlldywgc2hvdWxkQ29weSkge1xuICAgICAgICAgICAgICAgIHZpZXcgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRPclVwZGF0ZU1lbW9yeVZpZXcodmlldyk7XG4gICAgICAgICAgICAgICAgaWYgKHZpZXcuYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuZ2V0KHZpZXcpLCBhZGRyZXNzXzEgPSBfYS5hZGRyZXNzLCBvd25lcnNoaXBfMSA9IF9hLm93bmVyc2hpcCwgcnVudGltZUFsbG9jYXRlZF8xID0gX2EucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGFkZHJlc3M6IGFkZHJlc3NfMSwgb3duZXJzaGlwOiBvd25lcnNoaXBfMSwgcnVudGltZUFsbG9jYXRlZDogcnVudGltZUFsbG9jYXRlZF8xLCB2aWV3OiB2aWV3IH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYWRkcmVzczogdmlldy5ieXRlT2Zmc2V0LCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCwgdmlldzogdmlldyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgX2IgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIodmlldy5idWZmZXIsIHNob3VsZENvcHkpLCBhZGRyZXNzID0gX2IuYWRkcmVzcywgb3duZXJzaGlwID0gX2Iub3duZXJzaGlwLCBydW50aW1lQWxsb2NhdGVkID0gX2IucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBhZGRyZXNzOiBhZGRyZXNzID09PSAwID8gMCA6IChhZGRyZXNzICsgdmlldy5ieXRlT2Zmc2V0KSwgb3duZXJzaGlwOiBvd25lcnNoaXAsIHJ1bnRpbWVBbGxvY2F0ZWQ6IHJ1bnRpbWVBbGxvY2F0ZWQsIHZpZXc6IHZpZXcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpU3RyaW5nLmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpU3RyaW5nID0ge1xuICAgICAgICAgICAgdXRmOERlY29kZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHV0ZjE2RGVjb2RlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBmYWxsYmFja0RlY29kZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZ1NpemUgPSBNYXRoLm1pbigweDEwMDAsIGJ5dGVzLmxlbmd0aCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBuZXcgVWludDE2QXJyYXkocGVuZGluZ1NpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlbmRpbmdJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vcmUgPSBpbnB1dEluZGV4IDwgYnl0ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9yZSB8fCAocGVuZGluZ0luZGV4ID49IHBlbmRpbmdTaXplIC0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YmFycmF5ID0gcGVuZGluZy5zdWJhcnJheSgwLCBwZW5kaW5nSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyYXlsaWtlID0gc3ViYXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXlsaWtlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9yZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KGlucHV0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUxID0gYnl0ZXNbaW5wdXRJbmRleCsrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJ5dGUxICYgMHg4MCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSBieXRlMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhlMCkgPT09IDB4YzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0luZGV4KytdID0gKChieXRlMSAmIDB4MWYpIDw8IDYpIHwgYnl0ZTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChieXRlMSAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSAoKGJ5dGUxICYgMHgxZikgPDwgMTIpIHwgKGJ5dGUyIDw8IDYpIHwgYnl0ZTM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChieXRlMSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMiA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTMgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGU0ID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2RlcG9pbnQgPSAoKGJ5dGUxICYgMHgwNykgPDwgMHgxMikgfCAoYnl0ZTIgPDwgMHgwYykgfCAoYnl0ZTMgPDwgMHgwNikgfCBieXRlNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50IC09IDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IChjb2RlcG9pbnQgPj4+IDEwKSAmIDB4M2ZmIHwgMHhkODAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBvaW50ID0gMHhkYzAwIHwgY29kZXBvaW50ICYgMHgzZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSBjb2RlcG9pbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgdXRmOERlY29kZXI7XG4gICAgICAgICAgICAgICAgdXRmOERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoKSA6IGZhbGxiYWNrRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBlbW5hcGlTdHJpbmcudXRmOERlY29kZXIgPSB1dGY4RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB2YXIgZmFsbGJhY2tEZWNvZGVyMiA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IG5ldyBVaW50MTZBcnJheShpbnB1dC5idWZmZXIsIGlucHV0LmJ5dGVPZmZzZXQsIGlucHV0LmJ5dGVMZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPD0gMHgxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBNYXRoLm1pbigweDEwMDAsIGJ5dGVzLmxlbmd0aCAtIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYnl0ZXMuc3ViYXJyYXkoaSwgaSArIGxlbikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaHVua3Muam9pbignJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB1dGYxNkRlY29kZXI7XG4gICAgICAgICAgICAgICAgdXRmMTZEZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHREZWNvZGVyKCd1dGYtMTZsZScpIDogZmFsbGJhY2tEZWNvZGVyMjtcbiAgICAgICAgICAgICAgICBlbW5hcGlTdHJpbmcudXRmMTZEZWNvZGVyID0gdXRmMTZEZWNvZGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlbmd0aEJ5dGVzVVRGODogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHZhciBjO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPD0gMHg3Rikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8PSAweDdGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlbjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBVVEY4VG9TdHJpbmc6IGZ1bmN0aW9uIChwdHIsIGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmICghcHRyIHx8ICFsZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICBwdHIgPj4+PSAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IHB0cjtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgSEVBUFU4W2VuZF07KVxuICAgICAgICAgICAgICAgICAgICAgICAgKytlbmQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBwdHIgKyAobGVuZ3RoID4+PiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMTYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IHB0cjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4IDwgZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTAgPSBIRUFQVThbaWR4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodTAgJiAweDgwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHUwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MSA9IEhFQVBVOFtpZHgrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAweEUwKSA9PT0gMHhDMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgodTAgJiAzMSkgPDwgNikgfCB1MSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTIgPSBIRUFQVThbaWR4KytdICYgNjM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUwICYgMHhGMCkgPT09IDB4RTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiAxNSkgPDwgMTIpIHwgKHUxIDw8IDYpIHwgdTI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MCA9ICgodTAgJiA3KSA8PCAxOCkgfCAodTEgPDwgMTIpIHwgKHUyIDw8IDYpIHwgKEhFQVBVOFtpZHgrK10gJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodTAgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gdTAgLSAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RDgwMCB8IChjaCA+PiAxMCksIDB4REMwMCB8IChjaCAmIDB4M0ZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy51dGY4RGVjb2Rlci5kZWNvZGUoKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlci5jb25zdHJ1Y3RvcikgPT09IFwiW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl1cIikpID8gSEVBUFU4LnNsaWNlKHB0ciwgZW5kKSA6IEhFQVBVOC5zdWJhcnJheShwdHIsIGVuZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmluZ1RvVVRGODogZnVuY3Rpb24gKHN0ciwgb3V0UHRyLCBtYXhCeXRlc1RvV3JpdGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUFU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBvdXRJZHggPSBvdXRQdHI7XG4gICAgICAgICAgICAgICAgb3V0SWR4ID4+Pj0gMDtcbiAgICAgICAgICAgICAgICBpZiAoIShtYXhCeXRlc1RvV3JpdGUgPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0SWR4ID0gb3V0SWR4O1xuICAgICAgICAgICAgICAgIHZhciBlbmRJZHggPSBvdXRJZHggKyBtYXhCeXRlc1RvV3JpdGUgLSAxO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1ID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID49IDB4RDgwMCAmJiB1IDw9IDB4REZGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gc3RyLmNoYXJDb2RlQXQoKytpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAweDEwMDAwICsgKCh1ICYgMHgzRkYpIDw8IDEwKSB8ICh1MSAmIDB4M0ZGKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodSA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0SWR4ID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSB1O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHUgPD0gMHg3RkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAxID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEMwIHwgKHUgPj4gNik7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHUgPD0gMHhGRkZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0SWR4ICsgMiA+PSBlbmRJZHgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHhFMCB8ICh1ID4+IDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKCh1ID4+IDYpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAodSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAzID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEYwIHwgKHUgPj4gMTgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gMTIpICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gNikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHhdID0gMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0SWR4IC0gc3RhcnRJZHg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVVRGMTZUb1N0cmluZzogZnVuY3Rpb24gKHB0ciwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwdHIgfHwgIWxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHB0ciA+Pj49IDA7XG4gICAgICAgICAgICAgICAgdmFyIGVuZCA9IHB0cjtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gZW5kID4+IDE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEhFQVBVMTZbaWR4XSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBpZHggPDwgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHB0ciArIChsZW5ndGggPj4+IDApICogMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gZW5kIC0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPD0gMzIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQxNkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBwdHIsIGxlbmd0aCAvIDIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy51dGYxNkRlY29kZXIuZGVjb2RlKCgodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgSEVBUFU4LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEhFQVBVOC5idWZmZXIuY29uc3RydWN0b3IpID09PSBcIltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdXCIpKSA/IEhFQVBVOC5zbGljZShwdHIsIGVuZCkgOiBIRUFQVTguc3ViYXJyYXkocHRyLCBlbmQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdHJpbmdUb1VURjE2OiBmdW5jdGlvbiAoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgPSAweDdGRkZGRkZGO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF4Qnl0ZXNUb1dyaXRlIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1dyaXRlIC09IDI7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0UHRyID0gb3V0UHRyO1xuICAgICAgICAgICAgICAgIHZhciBudW1DaGFyc1RvV3JpdGUgPSAobWF4Qnl0ZXNUb1dyaXRlIDwgc3RyLmxlbmd0aCAqIDIpID8gKG1heEJ5dGVzVG9Xcml0ZSAvIDIpIDogc3RyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ2hhcnNUb1dyaXRlOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29kZVVuaXQgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MTYob3V0UHRyLCBjb2RlVW5pdCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQxNihvdXRQdHIsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRQdHIgLSBzdGFydFB0cjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXdTdHJpbmc6IGZ1bmN0aW9uIChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQsIHN0cmluZ01ha2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB2YXIgYXV0b0xlbmd0aCA9IGxlbmd0aCA9PT0gLTE7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghKGF1dG9MZW5ndGggfHwgKHNpemVsZW5ndGggPD0gMjE0NzQ4MzY0NykpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdHJWYWx1ZSA9IHN0cmluZ01ha2VyKHN0ciwgYXV0b0xlbmd0aCwgc2l6ZWxlbmd0aCk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShzdHJWYWx1ZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3RXh0ZXJuYWxTdHJpbmc6IGZ1bmN0aW9uIChlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIGNyZWF0ZUFwaSwgc3RyaW5nTWFrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZWxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IGNyZWF0ZUFwaShlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29waWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChjb3BpZWQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXIoZmluYWxpemVfY2FsbGJhY2ssIHN0ciwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9hcnJheV9sZW5ndGgoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDggLyogbmFwaV9zdGF0dXMubmFwaV9hcnJheV9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZS5sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FycmF5YnVmZmVyX2luZm8oZW52LCBhcnJheWJ1ZmZlciwgZGF0YSwgYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoaGFuZGxlLnZhbHVlLCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGRhdGEsIHAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfbGVuZ3RoLCBoYW5kbGUudmFsdWUuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9wcm90b3R5cGUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSA/IGhhbmRsZS52YWx1ZSA6IE9iamVjdChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvKGVudiwgdHlwZWRhcnJheSwgdHlwZSwgbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdHlwZWRhcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodHlwZWRhcnJheSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc1R5cGVkQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAyIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlndWludDY0X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHR5cGUsIHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihsZW5ndGgsIHYubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvKGVudiwgYnVmZmVyLCBkYXRhLCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNCdWZmZXIoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbyhlbnYsIGJ1ZmZlciwgMCwgbGVuZ3RoLCBkYXRhLCAwLCAwKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2RhdGF2aWV3X2luZm8oZW52LCBkYXRhdmlldywgYnl0ZV9sZW5ndGgsIGRhdGEsIGFycmF5YnVmZmVyLCBieXRlX29mZnNldCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFkYXRhdmlldylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZGF0YXZpZXcpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNEYXRhVmlldygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2ID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChieXRlX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX2xlbmd0aCwgdi5ieXRlTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfZGF0ZV92YWx1ZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgPSBoYW5kbGUudmFsdWUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig3IC8qIG5hcGlfc3RhdHVzLm5hcGlfYm9vbGVhbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGhhbmRsZS52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0LCBsb3NzbGVzcykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFsb3NzbGVzcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW1iZXJWYWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0KGVudiwgdmFsdWUsIHJlc3VsdCwgbG9zc2xlc3MpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghbG9zc2xlc3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbnVtYmVyVmFsdWUgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKChudW1iZXJWYWx1ZSA+PSBCaWdJbnQoMCkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkcyhlbnYsIHZhbHVlLCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCF3b3JkX2NvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTcgLyogbmFwaV9zdGF0dXMubmFwaV9iaWdpbnRfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzTWludXMgPSBoYW5kbGUudmFsdWUgPCBCaWdJbnQoMCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgdmFyIHdvcmRfY291bnRfaW50ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmRDb3VudCA9IDA7XG4gICAgICAgICAgICB2YXIgYmlnaW50VmFsdWUgPSBpc01pbnVzID8gKGhhbmRsZS52YWx1ZSAqIEJpZ0ludCgtMSkpIDogaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQrKztcbiAgICAgICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGJpZ2ludFZhbHVlID4+IEJpZ0ludCg2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGlzTWludXMgPyAoaGFuZGxlLnZhbHVlICogQmlnSW50KC0xKSkgOiBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICBpZiAoIXNpZ25fYml0ICYmICF3b3Jkcykge1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnRfaW50ID0gd29yZENvdW50O1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCB3b3JkX2NvdW50X2ludCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25fYml0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghd29yZHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmRzQXJyID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVpbnQ2NCA9IGJpZ2ludFZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgICAgICB3b3Jkc0Fyci5wdXNoKHVpbnQ2NCk7XG4gICAgICAgICAgICAgICAgICAgIGJpZ2ludFZhbHVlID0gYmlnaW50VmFsdWUgPj4gQmlnSW50KDY0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHdvcmRfY291bnRfaW50LCB3b3Jkc0Fyci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG93ID0gTnVtYmVyKHdvcmRzQXJyW2ldICYgQmlnSW50KDB4ZmZmZmZmZmYpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcih3b3Jkc0FycltpXSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRzICsgaSAqIDgsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkcyArIGkgKiA4ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHNpZ25fYml0LCBpc01pbnVzID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCBsZW4sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWwoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNFeHRlcm5hbCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwID0gaGFuZGxlLmRhdGEoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfaW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IG5ldyBJbnQzMkFycmF5KFtoYW5kbGUudmFsdWVdKVswXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbnVtYmVyVmFsdWUgPSBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKG51bWJlclZhbHVlID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHwgbnVtYmVyVmFsdWUgPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSB8fCBpc05hTihudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCArIDQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnVtYmVyVmFsdWUgPCAvKiBJTlQ2NF9SQU5HRV9ORUdBVElWRSAqLyAtOTIyMzM3MjAzNjg1NDc3NjAwMCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgMHg4MDAwMDAwMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChudW1iZXJWYWx1ZSA+PSAvKiBJTlQ2NF9SQU5HRV9QT1NJVElWRSAqLyA5MjIzMzcyMDM2ODU0Nzc2MDAwKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgMHhmZmZmZmZmZiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCArIDQsIDB4N2ZmZmZmZmYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgJGVtbmFwaVNldFZhbHVlSTY0KHJlc3VsdCwgTWF0aC50cnVuYyhudW1iZXJWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xKGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgaGFuZGxlLnZhbHVlLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmX3NpemUgLSAxOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLnZhbHVlLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50OChidWYgKyBpLCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICBjb3BpZWQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDgoYnVmICsgY29waWVkLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGNvcGllZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGY4KGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBzdHJMZW5ndGggPSBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGhhbmRsZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgc3RyTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1Zl9zaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGhhbmRsZS52YWx1ZSwgYnVmLCBidWZfc2l6ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmMTYoZW52LCB2YWx1ZSwgYnVmLCBidWZfc2l6ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBidWZfc2l6ZSA9IGJ1Zl9zaXplID4+PiAwO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGUudmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFidWYpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBoYW5kbGUudmFsdWUubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1Zl9zaXplICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBjb3BpZWQgPSBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEYxNihoYW5kbGUudmFsdWUsIGJ1ZiwgYnVmX3NpemUgKiAyKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGNvcGllZCAvIDIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfdWludDMyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDYgLyogbmFwaV9zdGF0dXMubmFwaV9udW1iZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBuZXcgVWludDMyQXJyYXkoW2hhbmRsZS52YWx1ZV0pWzBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjb252ZXJ0MmNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfYXJyYXlfbGVuZ3RoOiBuYXBpX2dldF9hcnJheV9sZW5ndGgsXG4gICAgICAgICAgICBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvOiBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfYnVmZmVyX2luZm86IG5hcGlfZ2V0X2J1ZmZlcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfZGF0YXZpZXdfaW5mbzogbmFwaV9nZXRfZGF0YXZpZXdfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2RhdGVfdmFsdWU6IG5hcGlfZ2V0X2RhdGVfdmFsdWUsXG4gICAgICAgICAgICBuYXBpX2dldF9wcm90b3R5cGU6IG5hcGlfZ2V0X3Byb3RvdHlwZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbzogbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X2ludDY0OiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0OiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X3dvcmRzOiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfd29yZHMsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9ib29sOiBuYXBpX2dldF92YWx1ZV9ib29sLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfZG91YmxlOiBuYXBpX2dldF92YWx1ZV9kb3VibGUsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9leHRlcm5hbDogbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWwsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9pbnQzMjogbmFwaV9nZXRfdmFsdWVfaW50MzIsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9pbnQ2NDogbmFwaV9nZXRfdmFsdWVfaW50NjQsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xOiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfbGF0aW4xLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2OiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmMTYsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmODogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjgsXG4gICAgICAgICAgICBuYXBpX2dldF92YWx1ZV91aW50MzI6IG5hcGlfZ2V0X3ZhbHVlX3VpbnQzMlxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9pbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3VpbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSA+Pj4gMCkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwanBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2ludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghaGlnaClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIobG93KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBkcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZG91YmxlKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ19sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLm5ld1N0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQsIGZ1bmN0aW9uIChzdHIsIGF1dG9MZW5ndGgsIHNpemVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGF0aW4xU3RyaW5nID0gJyc7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b0xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDgoc3RyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2gpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXRpbjFTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA8IHNpemVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQ4KHN0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aW4xU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0aW4xU3RyaW5nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5VVEYxNlRvU3RyaW5nKHN0ciwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ191dGY4KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcoc3RyLCBsZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2hpbnQsIHJlc3VsdCwgY29waWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLm5ld0V4dGVybmFsU3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCwgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdFeHRlcm5hbFN0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfcHJvcGVydHlfa2V5X3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBqcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X2ludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoaWdoKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YWx1ZSA9IGxvdztcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBqcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X3VpbnQ2NChlbnYsIGxvdywgaGlnaCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghaGlnaClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFsdWUgPSBsb3cgJiAoKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjQpKSAtIEJpZ0ludCgxKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjEgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGhpZ2gsIHYxLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYmlnaW50X3dvcmRzKGVudiwgc2lnbl9iaXQsIHdvcmRfY291bnQsIHdvcmRzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2LCBpO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgd29yZF9jb3VudCA9IHdvcmRfY291bnQgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmRfY291bnQgPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3b3JkX2NvdW50ID4gKDEwMjQgKiAxMDI0IC8gKDQgKiA4KSAvIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNYXhpbXVtIEJpZ0ludCBzaXplIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEJpZ0ludCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkX2NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvdyA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQzMih3b3JkcyArIGkgKiA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhpZ2ggPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50MzIod29yZHMgKyBpICogOCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGkgPSBCaWdJbnQobG93KSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHdvcmRpIDw8IEJpZ0ludCg2NCAqIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoKEJpZ0ludChzaWduX2JpdCkgJSBCaWdJbnQoMikgPT09IEJpZ0ludCgwKSkgPyBCaWdJbnQoMSkgOiBCaWdJbnQoLTEpKTtcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnZlcnQybmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF9pbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHM6IG5hcGlfY3JlYXRlX2JpZ2ludF93b3JkcyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RvdWJsZTogbmFwaV9jcmVhdGVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50MzI6IG5hcGlfY3JlYXRlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50NjQ6IG5hcGlfY3JlYXRlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMTogbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNjogbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX3V0Zjg6IG5hcGlfY3JlYXRlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdWludDMyOiBuYXBpX2NyZWF0ZV91aW50MzIsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX2xhdGluMTogbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2OiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNjogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNlxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjYiwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9ICghdXRmOG5hbWUgfHwgIWxlbmd0aCkgPyAnJyA6IChlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCBsZW5ndGgpKTtcbiAgICAgICAgICAgIHZhciBmO1xuICAgICAgICAgICAgdmFyIG1ha2VGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2JpbmZvID0gZW1uYXBpQ3R4LmNiaW5mb1N0YWNrLnB1c2godGhpcywgZGF0YSwgYXJndW1lbnRzLCBmKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jYWxsSW50b01vZHVsZShmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9ICh3YXNtVGFibGUuZ2V0KGNiKSkoZW52T2JqZWN0LmlkLCBjYmluZm8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoIW5hcGlWYWx1ZSkgPyB1bmRlZmluZWQgOiBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG5hcGlWYWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jYmluZm9TdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lID09PSAnJykge1xuICAgICAgICAgICAgICAgIGYgPSBtYWtlRnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgZjogZiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoL15bXyRhLXpBLVpdW18kYS16QS1aMC05XSokLy50ZXN0KGZ1bmN0aW9uTmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8sIGY6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnROZXdGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciBfID0gbWFrZUZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZiA9IChuZXcgRnVuY3Rpb24oJ18nLCAncmV0dXJuIGZ1bmN0aW9uICcgKyBmdW5jdGlvbk5hbWUgKyAnKCl7JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCJ1c2Ugc3RyaWN0XCI7JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuIF8uYXBwbHkodGhpcyxhcmd1bWVudHMpOycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ307JykpKF8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgICAgICBmID0gbWFrZUZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgJ25hbWUnLCB7IHZhbHVlOiBmdW5jdGlvbk5hbWUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovLCBmOiBmIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBvYmosIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsR2V0dGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbFNldHRlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR2V0dGVyID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCAwLCAwLCBnZXR0ZXIsIGRhdGEpLmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXR0ZXIgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIDAsIDAsIHNldHRlciwgZGF0YSkuZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogKGF0dHJpYnV0ZXMgJiA0IC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2NvbmZpZ3VyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IChhdHRyaWJ1dGVzICYgMiAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9lbnVtZXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBsb2NhbEdldHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBsb2NhbFNldHRlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCBkZXNjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbE1ldGhvZCA9IGVtbmFwaUNyZWF0ZUZ1bmN0aW9uKGVudk9iamVjdCwgMCwgMCwgbWV0aG9kLCBkYXRhKS5mO1xuICAgICAgICAgICAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IChhdHRyaWJ1dGVzICYgNCAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9jb25maWd1cmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAoYXR0cmlidXRlcyAmIDIgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfZW51bWVyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAoYXR0cmlidXRlcyAmIDEgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfd3JpdGFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxNZXRob2RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAoYXR0cmlidXRlcyAmIDQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfY29uZmlndXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogKGF0dHJpYnV0ZXMgJiAyIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2VudW1lcmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogKGF0dHJpYnV0ZXMgJiAxIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX3dyaXRhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoIShoYW5kbGUuaXNPYmplY3QoKSB8fCBoYW5kbGUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVtbmFwaUV4dGVybmFsTWVtb3J5ICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoaGFuZGxlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhoYW5kbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmdldChoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgaGFuZGxlOiBoYW5kbGUgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQ7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfd3JhcCcsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yKCduYXBpX3dyYXAnLCAnUGFyYW1ldGVyIFwicmVzdWx0XCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZVJlc3VsdCA9IGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVSZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoaGFuZGxlUmVzdWx0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVSZXN1bHQuaGFuZGxlO1xuICAgICAgICAgICAgICAgIGlmIChlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyhoYW5kbGUudmFsdWUpLndyYXBwZWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxpemVfY2IpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcmVmZXJlbmNlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCAhZmluYWxpemVfY2IgPyBmaW5hbGl6ZV9jYiA6IGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyhoYW5kbGUudmFsdWUpLndyYXBwZWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGF0YTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWpzX29iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAwIC8qIFVud3JhcEFjdGlvbi5LZWVwV3JhcCAqLykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoanNfb2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gYmluZGluZy53cmFwcGVkO1xuICAgICAgICAgICAgICAgIHZhciByZWYgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZmVyZW5jZUlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlZi5kYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09IDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZy53cmFwcGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5vd25lcnNoaXAoKSA9PT0gMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB3cmFwIGlzIGJlZW4gcmVtb3ZlZCwgdGhlIGZpbmFsaXplciBzaG91bGQgYmUgcmVzZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWYucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWZpbmVfY2xhc3MoZW52LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSwgcHJvcGVydHlfY291bnQsIHByb3BlcnRpZXMsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHByb3BQdHIsIHZhbHVlSGFuZGxlSWQsIGF0dHJpYnV0ZXM7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPCAtMSkgfHwgKGxlbmd0aCA+IDIxNDc0ODM2NDcpIHx8ICghdXRmOG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcmVzdWx0ID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGZyZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB2YXIgRiA9IGZyZXN1bHQuZjtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMSA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzEpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcyAmIDEwMjQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfc3RhdGljICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBGLCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgRi5wcm90b3R5cGUsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlSGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKEYpO1xuICAgICAgICAgICAgICAgIHZhbHVlSGFuZGxlSWQgPSB2YWx1ZUhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlSGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3dyYXAoZW52LCBqc19vYmplY3QsIG5hdGl2ZV9vYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZW1vdmVfd3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpVW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQsIDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlX3RhZ19vYmplY3QoZW52LCBvYmplY3QsIHR5cGVfdGFnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVfdGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZyA9IGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy50YWcgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0YWcgPSBuZXcgVWludDhBcnJheSgxNik7XG4gICAgICAgICAgICAgICAgdGFnLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgdHlwZV90YWcsIDE2KSk7XG4gICAgICAgICAgICAgICAgYmluZGluZy50YWcgPSBuZXcgVWludDMyQXJyYXkodGFnLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZyhlbnYsIG9iamVjdCwgdHlwZV90YWcsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgb25lLXZhclxuICAgICAgICAgICAgdmFyIHJldCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZS5pc09iamVjdCgpIHx8IHZhbHVlLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGVfdGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmcgPSBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcudGFnICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWcgPSBiaW5kaW5nLnRhZztcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGVUYWcgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHR5cGVfdGFnLCA0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gKHRhZ1swXSA9PT0gdHlwZVRhZ1swXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnWzFdID09PSB0eXBlVGFnWzFdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdbMl0gPT09IHR5cGVUYWdbMl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1szXSA9PT0gdHlwZVRhZ1szXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgcmV0ID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9maW5hbGl6ZXIoZW52LCBqc19vYmplY3QsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghZmluYWxpemVfY2IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVSZXN1bHQgPSBlbW5hcGlHZXRIYW5kbGUoanNfb2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVSZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihoYW5kbGVSZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVSZXN1bHQuaGFuZGxlO1xuICAgICAgICAgICAgdmFyIG93bmVyc2hpcCA9ICFyZXN1bHQgPyAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLyA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLztcbiAgICAgICAgICAgIHZhciByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCBvd25lcnNoaXAsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHJlZmVyZW5jZUlkID0gcmVmZXJlbmNlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByZWZlcmVuY2VJZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXIoZW52LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuZW5xdWV1ZUZpbmFsaXplcihlbW5hcGlDdHguY3JlYXRlVHJhY2tlZEZpbmFsaXplcihlbnZPYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdyYXBNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9hZGRfZmluYWxpemVyOiBuYXBpX2FkZF9maW5hbGl6ZXIsXG4gICAgICAgICAgICBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZzogbmFwaV9jaGVja19vYmplY3RfdHlwZV90YWcsXG4gICAgICAgICAgICBuYXBpX2RlZmluZV9jbGFzczogbmFwaV9kZWZpbmVfY2xhc3MsXG4gICAgICAgICAgICBuYXBpX3JlbW92ZV93cmFwOiBuYXBpX3JlbW92ZV93cmFwLFxuICAgICAgICAgICAgbmFwaV90eXBlX3RhZ19vYmplY3Q6IG5hcGlfdHlwZV90YWdfb2JqZWN0LFxuICAgICAgICAgICAgbmFwaV91bndyYXA6IG5hcGlfdW53cmFwLFxuICAgICAgICAgICAgbmFwaV93cmFwOiBuYXBpX3dyYXAsXG4gICAgICAgICAgICBub2RlX2FwaV9wb3N0X2ZpbmFsaXplcjogbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXJcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCB0eXBlZGFycmF5X3R5cGUsIGV4dGVybmFsX2RhdGEsIGJ5dGVfbGVuZ3RoLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAoIWV4dGVybmFsX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnl0ZV9sZW5ndGggPiAyMTQ3NDgzNjQ3KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDYW5ub3QgY3JlYXRlIGEgbWVtb3J5IHZpZXcgbGFyZ2VyIHRoYW4gMjE0NzQ4MzY0NyBieXRlcycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGV4dGVybmFsX2RhdGEgKyBieXRlX2xlbmd0aCkgPiB3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdNZW1vcnkgb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplciAmJiBmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydFdlYWtSZWZFcnJvcignZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldycsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmlld0Rlc2NyaXB0b3IgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlZGFycmF5X3R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9pbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEludDhBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX3VpbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQ4QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50OF9jbGFtcGVkX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQ4Q2xhbXBlZEFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50MTZfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogSW50MTZBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAxLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQxNkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDEsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9pbnQzMl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBJbnQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA2IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogVWludDMyQXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMiwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDcgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2Zsb2F0MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogRmxvYXQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9mbG9hdDY0X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEZsb2F0NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOSAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYmlnaW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogQmlnSW50NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2JpZ3VpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBCaWdVaW50NjRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAzLCBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgLTEgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2RhdGFfdmlldyAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBEYXRhVmlldywgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0yIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9idWZmZXIgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvcignZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldycsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXIsIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgQ3RvciA9IHZpZXdEZXNjcmlwdG9yLkN0b3I7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGVkQXJyYXkgPSB0eXBlZGFycmF5X3R5cGUgPT09IC0yIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9idWZmZXIgKi9cbiAgICAgICAgICAgICAgICAgICAgPyBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXIuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgdmlld0Rlc2NyaXB0b3IuYWRkcmVzcywgdmlld0Rlc2NyaXB0b3IubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBDdG9yKHdhc21NZW1vcnkuYnVmZmVyLCB2aWV3RGVzY3JpcHRvci5hZGRyZXNzLCB2aWV3RGVzY3JpcHRvci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodHlwZWRBcnJheSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQodHlwZWRBcnJheSwgdmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgIGlmIChmaW5hbGl6ZV9jYikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzXzEgPSBuYXBpX2FkZF9maW5hbGl6ZXIoZW52LCBoYW5kbGUuaWQsIGV4dGVybmFsX2RhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCAvKiBOVUxMICovIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzXzEgPT09IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBlbnZPYmplY3QudHJ5Q2F0Y2guZXh0cmFjdEV4Y2VwdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzXzEgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzXzEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gaGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19zdXBwb3J0X3dlYWtyZWYoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEZpbmFsaXplciA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQgPyAxIDogMDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaU5vZGVCaW5kaW5nID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gJGVtbmFwaVN5bmNNZW1vcnkoanNfdG9fd2FzbSwgYXJyYXlCdWZmZXJPclZpZXcsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgIT09IG51bGwgJiYgb2Zmc2V0ICE9PSB2b2lkIDAgPyBvZmZzZXQgOiAwO1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgdmFyIHZpZXc7XG4gICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXJPclZpZXcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0QXJyYXlCdWZmZXJQb2ludGVyKGFycmF5QnVmZmVyT3JWaWV3LCBmYWxzZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICBpZiAoIXBvaW50ZXIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBBcnJheUJ1ZmZlciBhZGRyZXNzJyk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsZW4gIT09ICdudW1iZXInIHx8IGxlbiA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVuID0gYXJyYXlCdWZmZXJPclZpZXcuYnl0ZUxlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuID0gbGVuID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlck9yVmlldztcbiAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXJPclZpZXcsIG9mZnNldCwgbGVuKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FzbU1lbW9yeVU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghanNfdG9fd2FzbSkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldCh3YXNtTWVtb3J5VTguc3ViYXJyYXkocG9pbnRlciwgcG9pbnRlciArIGxlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeVU4LnNldCh2aWV3LCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5QnVmZmVyT3JWaWV3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhhcnJheUJ1ZmZlck9yVmlldykpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlld1BvaW50ZXJJbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0Vmlld1BvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgbGF0ZXN0VmlldyA9IHZpZXdQb2ludGVySW5mby52aWV3O1xuICAgICAgICAgICAgICAgIHZhciBwb2ludGVyID0gdmlld1BvaW50ZXJJbmZvLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQXJyYXlCdWZmZXIgYWRkcmVzcycpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGVuICE9PSAnbnVtYmVyJyB8fCBsZW4gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbiA9IGxhdGVzdFZpZXcuYnl0ZUxlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuID0gbGVuID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXRlc3RWaWV3O1xuICAgICAgICAgICAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheShsYXRlc3RWaWV3LmJ1ZmZlciwgbGF0ZXN0Vmlldy5ieXRlT2Zmc2V0ICsgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIHZhciB3YXNtTWVtb3J5VTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKCFqc190b193YXNtKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0KHdhc21NZW1vcnlVOC5zdWJhcnJheShwb2ludGVyLCBwb2ludGVyICsgbGVuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YXNtTWVtb3J5VTguc2V0KHZpZXcsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0VmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VtbmFwaVN5bmNNZW1vcnkgZXhwZWN0IEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlldyBhcyBmaXJzdCBwYXJhbWV0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX3N5bmNfbWVtb3J5KGVudiwganNfdG9fd2FzbSwgYXJyYXlidWZmZXJfb3Jfdmlldywgb2Zmc2V0LCBsZW4pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVJZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChoYW5kbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheUJ1ZmZlcigpICYmICFoYW5kbGUuaXNUeXBlZEFycmF5KCkgJiYgIWhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9ICRlbW5hcGlTeW5jTWVtb3J5KEJvb2xlYW4oanNfdG9fd2FzbSksIGhhbmRsZS52YWx1ZSwgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgIT09IHJldCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzKGFycmF5QnVmZmVyT3JWaWV3KSB7XG4gICAgICAgICAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgRGF0YVZpZXc7XG4gICAgICAgICAgICB2YXIgaXNUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5QnVmZmVyT3JWaWV3KSAmJiAhaXNEYXRhVmlldztcbiAgICAgICAgICAgIGlmICghaXNBcnJheUJ1ZmZlciAmJiAhaXNUeXBlZEFycmF5ICYmICFpc0RhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyBleHBlY3QgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3IGFzIGZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGluZm87XG4gICAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBpbmZvLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgb3duZXJzaGlwOiBpbmZvLm93bmVyc2hpcCxcbiAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyhlbnYsIGFycmF5YnVmZmVyX29yX3ZpZXcsIGFkZHJlc3MsIG93bmVyc2hpcCwgcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwLCBydW50aW1lQWxsb2NhdGVkLCBvd25lcnNoaXBPdXQ7XG4gICAgICAgICAgICB2YXIgaW5mbztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyX29yX3ZpZXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzICYmICFvd25lcnNoaXAgJiYgIXJ1bnRpbWVfYWxsb2NhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcl9vcl92aWV3KTtcbiAgICAgICAgICAgICAgICBpbmZvID0gJGVtbmFwaUdldE1lbW9yeUFkZHJlc3MoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBwID0gaW5mby5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYWRkcmVzcywgcCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChvd25lcnNoaXApIHtcbiAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwT3V0ID0gaW5mby5vd25lcnNoaXA7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKG93bmVyc2hpcCwgb3duZXJzaGlwT3V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWVfYWxsb2NhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQgPSBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocnVudGltZV9hbGxvY2F0ZWQsIHJ1bnRpbWVBbGxvY2F0ZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfZ2V0X3J1bnRpbWVfdmVyc2lvbihlbnYsIHZlcnNpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCF2ZXJzaW9uKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcnVudGltZVZlcnNpb247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVWZXJzaW9uID0gZW1uYXBpQ3R4LmdldFJ1bnRpbWVWZXJzaW9ucygpLnZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZlcnNpb25zID0gcnVudGltZVZlcnNpb24uc3BsaXQoJy4nKVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIE51bWJlcihuKTsgfSk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24sIHZlcnNpb25zWzBdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih2ZXJzaW9uICsgNCwgdmVyc2lvbnNbMV0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24gKyA4LCB2ZXJzaW9uc1syXSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVtbmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzczogJGVtbmFwaUdldE1lbW9yeUFkZHJlc3MsXG4gICAgICAgICAgICAkZW1uYXBpU3luY01lbW9yeTogJGVtbmFwaVN5bmNNZW1vcnksXG4gICAgICAgICAgICBlbW5hcGlfY3JlYXRlX21lbW9yeV92aWV3OiBlbW5hcGlfY3JlYXRlX21lbW9yeV92aWV3LFxuICAgICAgICAgICAgZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzczogZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyxcbiAgICAgICAgICAgIGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uOiBlbW5hcGlfZ2V0X3J1bnRpbWVfdmVyc2lvbixcbiAgICAgICAgICAgIGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlOiBlbW5hcGlfaXNfbm9kZV9iaW5kaW5nX2F2YWlsYWJsZSxcbiAgICAgICAgICAgIGVtbmFwaV9pc19zdXBwb3J0X2JpZ2ludDogZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50LFxuICAgICAgICAgICAgZW1uYXBpX2lzX3N1cHBvcnRfd2Vha3JlZjogZW1uYXBpX2lzX3N1cHBvcnRfd2Vha3JlZixcbiAgICAgICAgICAgIGVtbmFwaV9zeW5jX21lbW9yeTogZW1uYXBpX3N5bmNfbWVtb3J5XG4gICAgICAgIH0pO1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYXJyYXkoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoW10pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGgoZW52LCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShuZXcgQXJyYXkobGVuZ3RoKSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpQ3JlYXRlQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgsIGRhdGEpIHtcbiAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXIsIHRydWUpLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheWJ1ZmZlcihlbnYsIGJ5dGVfbGVuZ3RoLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYXJyYXlCdWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwZHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2RhdGUoZW52LCB0aW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUobmV3IERhdGUodGltZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWwoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0RmluYWxpemVyICYmIGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yKCduYXBpX2NyZWF0ZV9leHRlcm5hbCcsICdQYXJhbWV0ZXIgXCJmaW5hbGl6ZV9jYlwiIG11c3QgYmUgMChOVUxMKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXh0ZXJuYWxIYW5kbGUgPSBlbW5hcGlDdHguZ2V0Q3VycmVudFNjb3BlKCkuYWRkRXh0ZXJuYWwoZW52T2JqZWN0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGV4dGVybmFsSGFuZGxlLmlkLCAwLCAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLywgZmluYWxpemVfY2IsIGRhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGV4dGVybmFsSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXIoZW52LCBleHRlcm5hbF9kYXRhLCBieXRlX2xlbmd0aCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsXzEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKGFycmF5QnVmZmVyLCBbYXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdThhcnIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHU4YXJyLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkoZXh0ZXJuYWxfZGF0YSwgZXh0ZXJuYWxfZGF0YSArIGJ5dGVfbGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLnNldChhcnJheUJ1ZmZlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNfMSA9IG5hcGlfYWRkX2ZpbmFsaXplcihlbnYsIGhhbmRsZS5pZCwgZXh0ZXJuYWxfZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIC8qIE5VTEwgKi8gMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfMSA9PT0gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0dXNfMSAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihzdGF0dXNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGUuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9vYmplY3QoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoe30pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3ltYm9sKGVudiwgZGVzY3JpcHRpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN5bWJvbC1kZXNjcmlwdGlvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKFN5bWJvbCgpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sKGRlc2MpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdHlwZWRhcnJheShlbnYsIHR5cGUsIGxlbmd0aCwgYXJyYXlidWZmZXIsIGJ5dGVfb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlVHlwZWRBcnJheSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIFR5cGUsIHNpemVfb2ZfZWxlbWVudCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSBieXRlX29mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9vZl9lbGVtZW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChieXRlX29mZnNldCkgJSAoc2l6ZV9vZl9lbGVtZW50KSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgUmFuZ2VFcnJvcihcInN0YXJ0IG9mZnNldCBvZiBcIi5jb25jYXQoKF9hID0gVHlwZS5uYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJywgXCIgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgXCIpLmNvbmNhdChzaXplX29mX2VsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFUlJfTkFQSV9JTlZBTElEX1RZUEVEQVJSQVlfQUxJR05NRU5UJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoKChsZW5ndGggKiBzaXplX29mX2VsZW1lbnQpICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfVFlQRURBUlJBWV9MRU5HVEgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgb3V0ID0gbmV3IFR5cGUoYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXMob3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KG91dCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBieXRlX29mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShvdXQpLmlkO1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBJbnQ4QXJyYXksIDEsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQ4X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50OEFycmF5LCAxLCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9jbGFtcGVkX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50OENsYW1wZWRBcnJheSwgMSwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50MTZfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDE2QXJyYXksIDIsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgVWludDE2QXJyYXksIDIsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBJbnQzMkFycmF5LCA0LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQzMkFycmF5LCA0LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBGbG9hdDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2Zsb2F0NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEZsb2F0NjRBcnJheSwgOCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA5IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlnaW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEJpZ0ludDY0QXJyYXksIDgsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWd1aW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEJpZ1VpbnQ2NEFycmF5LCA4LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9idWZmZXIoZW52LCBzaXplLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSwgcG9pbnRlcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcicsICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSB8fCAoc2l6ZSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvaW50ZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBzaXplKS5maWxsKDApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyXzEgPSBCdWZmZXIuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgcG9pbnRlciwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3RGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEN0b3I6IEJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHBvaW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXA6IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIE93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAxXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KGJ1ZmZlcl8xLCB2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIodmlld0Rlc2NyaXB0b3IsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXJfMSkuaWQ7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwb2ludGVyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfYnVmZmVyX2NvcHkoZW52LCBsZW5ndGgsIGRhdGEsIHJlc3VsdF9kYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5JywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihsZW5ndGgsIHJlc3VsdF9kYXRhKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KGRhdGEsIGRhdGEgKyBsZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcihlbnYsIGxlbmd0aCwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovLCBkYXRhLCBsZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRhdmlldyhlbnYsIGJ5dGVfbGVuZ3RoLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBieXRlX29mZnNldCA9IGJ5dGVfb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfbGVuZ3RoICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdieXRlX29mZnNldCArIGJ5dGVfbGVuZ3RoIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGFycmF5IHBhc3NlZCBpbicpO1xuICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFUlJfTkFQSV9JTlZBTElEX0RBVEFWSUVXX0FSR1MnO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXRhdmlldyA9IG5ldyBEYXRhVmlldyhidWZmZXIsIGJ5dGVfb2Zmc2V0LCBieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhkYXRhdmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KGRhdGF2aWV3LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RvcjogRGF0YVZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogYnl0ZV9vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBieXRlX2xlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXA6IDEgLyogT3duZXJzaGlwLmtVc2VybGFuZCAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZGF0YXZpZXcpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9zeW1ib2xfZm9yKGVudiwgdXRmOGRlc2NyaXB0aW9uLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgIHZhciBzaXplbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgaWYgKGxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghdXRmOGRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGRlc2NyaXB0aW9uU3RyaW5nID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyh1dGY4ZGVzY3JpcHRpb24sIGxlbmd0aCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sLmZvcihkZXNjcmlwdGlvblN0cmluZykpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjcmVhdGVNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXk6IG5hcGlfY3JlYXRlX2FycmF5LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGg6IG5hcGlfY3JlYXRlX2FycmF5X3dpdGhfbGVuZ3RoLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXJyYXlidWZmZXI6IG5hcGlfY3JlYXRlX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYnVmZmVyOiBuYXBpX2NyZWF0ZV9idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9idWZmZXJfY29weTogbmFwaV9jcmVhdGVfYnVmZmVyX2NvcHksXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9kYXRhdmlldzogbmFwaV9jcmVhdGVfZGF0YXZpZXcsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9kYXRlOiBuYXBpX2NyZWF0ZV9kYXRlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWw6IG5hcGlfY3JlYXRlX2V4dGVybmFsLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXI6IG5hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYnVmZmVyOiBuYXBpX2NyZWF0ZV9leHRlcm5hbF9idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9vYmplY3Q6IG5hcGlfY3JlYXRlX29iamVjdCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N5bWJvbDogbmFwaV9jcmVhdGVfc3ltYm9sLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdHlwZWRhcnJheTogbmFwaV9jcmVhdGVfdHlwZWRhcnJheSxcbiAgICAgICAgICAgIG5vZGVfYXBpX3N5bWJvbF9mb3I6IG5vZGVfYXBpX3N5bWJvbF9mb3JcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9ib29sZWFuKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gdmFsdWUgPT09IDAgPyAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLyA6IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9nbG9iYWwoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSA1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbnVsbChlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IDIgLyogR2xvYmFsSGFuZGxlLk5VTEwgKi87XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdW5kZWZpbmVkKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBnbG9iYWxNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfYm9vbGVhbjogbmFwaV9nZXRfYm9vbGVhbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2dsb2JhbDogbmFwaV9nZXRfZ2xvYmFsLFxuICAgICAgICAgICAgbmFwaV9nZXRfbnVsbDogbmFwaV9nZXRfbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3VuZGVmaW5lZDogbmFwaV9nZXRfdW5kZWZpbmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X2luc3RhbmNlX2RhdGEoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3Quc2V0SW5zdGFuY2VEYXRhKGRhdGEsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9pbnN0YW5jZV9kYXRhKGVudiwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWRhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudk9iamVjdC5nZXRJbnN0YW5jZURhdGEoKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2dldF9pbnN0YW5jZV9kYXRhOiBuYXBpX2dldF9pbnN0YW5jZV9kYXRhLFxuICAgICAgICAgICAgbmFwaV9zZXRfaW5zdGFuY2VfZGF0YTogbmFwaV9zZXRfaW5zdGFuY2VfZGF0YVxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyB2cHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2dldF9sYXN0X2Vycm9yX2luZm8oZW52LCBlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgdmFyIGxhc3RFcnJvciA9IGVudk9iamVjdC5sYXN0RXJyb3I7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZXJyb3JDb2RlID0gbGFzdEVycm9yLmVycm9yQ29kZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBlbmdpbmVFcnJvckNvZGUgPSBsYXN0RXJyb3IuZW5naW5lRXJyb3JDb2RlID4+PiAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGVuZ2luZVJlc2VydmVkID0gbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGVycm9yX2NvZGUsIGVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZUVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihlbmdpbmVfcmVzZXJ2ZWQsIGVuZ2luZVJlc2VydmVkLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93KGVudiwgZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGVycm9yKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93X2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdGhyb3dfdHlwZV9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IoZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtc2csIC0xKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNvZGUsIC0xKTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvd19yYW5nZV9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBSYW5nZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBTeW50YXhFcnJvcihlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKG1zZywgLTEpKTtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcoY29kZSwgLTEpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmcoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV90eXBlX2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBUeXBlRXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcmFuZ2VfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFJhbmdlRXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBtc2dWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobXNnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgU3ludGF4RXJyb3IobXNnVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZVZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb2RlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBjb2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoZXJyb3IpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FuZF9jbGVhcl9sYXN0X2V4Y2VwdGlvbihlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMSwgdHJ1ZSk7IC8vIElEX1VOREVGSU5FRFxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBlbnZPYmplY3QudHJ5Q2F0Y2guZXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChlcnIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdnBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9mYXRhbF9lcnJvcihsb2NhdGlvbiwgbG9jYXRpb25fbGVuLCBtZXNzYWdlLCBtZXNzYWdlX2xlbikge1xuICAgICAgICAgICAgdmFyIGxvY2F0aW9uU3RyID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhsb2NhdGlvbiwgbG9jYXRpb25fbGVuKTtcbiAgICAgICAgICAgIHZhciBtZXNzYWdlU3RyID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtZXNzYWdlLCBtZXNzYWdlX2xlbik7XG4gICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5uYXBpLmZhdGFsRXJyb3IobG9jYXRpb25TdHIsIG1lc3NhZ2VTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoJ0ZBVEFMIEVSUk9SOiAnICsgbG9jYXRpb25TdHIgKyAnICcgKyBtZXNzYWdlU3RyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2ZhdGFsX2V4Y2VwdGlvbihlbnYsIGVycikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZXJyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGVycik7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyaWdnZXJGYXRhbEV4Y2VwdGlvbihlcnJvci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfZ2V0X2xhc3RfZXJyb3JfaW5mbzogX2VtbmFwaV9nZXRfbGFzdF9lcnJvcl9pbmZvLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfZXJyb3I6IG5hcGlfY3JlYXRlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfcmFuZ2VfZXJyb3I6IG5hcGlfY3JlYXRlX3JhbmdlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdHlwZV9lcnJvcjogbmFwaV9jcmVhdGVfdHlwZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfZmF0YWxfZXJyb3I6IG5hcGlfZmF0YWxfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX2ZhdGFsX2V4Y2VwdGlvbjogbmFwaV9mYXRhbF9leGNlcHRpb24sXG4gICAgICAgICAgICBuYXBpX2dldF9hbmRfY2xlYXJfbGFzdF9leGNlcHRpb246IG5hcGlfZ2V0X2FuZF9jbGVhcl9sYXN0X2V4Y2VwdGlvbixcbiAgICAgICAgICAgIG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmc6IG5hcGlfaXNfZXhjZXB0aW9uX3BlbmRpbmcsXG4gICAgICAgICAgICBuYXBpX3Rocm93OiBuYXBpX3Rocm93LFxuICAgICAgICAgICAgbmFwaV90aHJvd19lcnJvcjogbmFwaV90aHJvd19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3I6IG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3Rocm93X3R5cGVfZXJyb3I6IG5hcGlfdGhyb3dfdHlwZV9lcnJvcixcbiAgICAgICAgICAgIG5vZGVfYXBpX2NyZWF0ZV9zeW50YXhfZXJyb3I6IG5vZGVfYXBpX2NyZWF0ZV9zeW50YXhfZXJyb3IsXG4gICAgICAgICAgICBub2RlX2FwaV90aHJvd19zeW50YXhfZXJyb3I6IG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2Z1bmN0aW9uKGVudiwgdXRmOG5hbWUsIGxlbmd0aCwgY2IsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZXN1bHQgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZnJlc3VsdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gZnJlc3VsdC5mO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShmKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfY2JfaW5mbyhlbnYsIGNiaW5mbywgYXJnYywgYXJndiwgdGhpc19hcmcsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5jYmluZm9TdGFjay5nZXQoY2JpbmZvKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYXJndikge1xuICAgICAgICAgICAgICAgIGlmICghYXJnYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnY1ZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKGFyZ2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSBjYmluZm9WYWx1ZS5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgYXJybGVuID0gYXJnY1ZhbHVlIDwgbGVuID8gYXJnY1ZhbHVlIDogbGVuO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFycmxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChjYmluZm9WYWx1ZS5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXJndiArIGkgKiA0LCBhcmdWYWwsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ2NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2NWYWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcmd2ICsgaSAqIDQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ2MpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYXJnYywgY2JpbmZvVmFsdWUuYXJncy5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXNfYXJnKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGNiaW5mb1ZhbHVlLnRoaXopO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRoaXNfYXJnLCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgY2JpbmZvVmFsdWUuZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF9mdW5jdGlvbihlbnYsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWN2KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdjhyZWN2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZWN2KS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWZ1bmMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHY4ZnVuYyA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZnVuYykudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2OGZ1bmMgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IHY4ZnVuYy5hcHBseSh2OHJlY3YsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9uZXdfaW5zdGFuY2UoZW52LCBjb25zdHJ1Y3RvciwgYXJnYywgYXJndiwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBDdG9yID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChjb25zdHJ1Y3RvcikudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBDdG9yICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydFJlZmxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ0xpc3QgPSBBcnJheShhcmdjKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0W2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IFJlZmxlY3QuY29uc3RydWN0KEN0b3IsIGFyZ0xpc3QsIEN0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheShhcmdjICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpICsgMV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIEJvdW5kQ3RvciA9IEN0b3IuYmluZC5hcHBseShDdG9yLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IEJvdW5kQ3RvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0KTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbmV3X3RhcmdldChlbnYsIGNiaW5mbywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWNiaW5mbylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5jYmluZm9TdGFjay5nZXQoY2JpbmZvKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNiaW5mb1ZhbHVlLmdldE5ld1RhcmdldChlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jdGlvbk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbGxfZnVuY3Rpb246IG5hcGlfY2FsbF9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Z1bmN0aW9uOiBuYXBpX2NyZWF0ZV9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2NiX2luZm86IG5hcGlfZ2V0X2NiX2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9uZXdfdGFyZ2V0OiBuYXBpX2dldF9uZXdfdGFyZ2V0LFxuICAgICAgICAgICAgbmFwaV9uZXdfaW5zdGFuY2U6IG5hcGlfbmV3X2luc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5faGFuZGxlX3Njb3BlKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgc2NvcGUuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghc2NvcGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICgoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEzIC8qIG5hcGlfc3RhdHVzLm5hcGlfaGFuZGxlX3Njb3BlX21pc21hdGNoICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fZXNjYXBhYmxlX2hhbmRsZV9zY29wZShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHNjb3BlLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTMgLyogbmFwaV9zdGF0dXMubmFwaV9oYW5kbGVfc2NvcGVfbWlzbWF0Y2ggKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9lc2NhcGVfaGFuZGxlKGVudiwgc2NvcGUsIGVzY2FwZWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHNjb3BlT2JqZWN0ID0gZW1uYXBpQ3R4LnNjb3BlU3RvcmUuZ2V0KHNjb3BlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmplY3QuZXNjYXBlQ2FsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3SGFuZGxlID0gc2NvcGVPYmplY3QuZXNjYXBlKGVzY2FwZWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXdIYW5kbGUgPyBuZXdIYW5kbGUuaWQgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTIgLyogbmFwaV9zdGF0dXMubmFwaV9lc2NhcGVfY2FsbGVkX3R3aWNlICovKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3JlZmVyZW5jZShlbnYsIHZhbHVlLCBpbml0aWFsX3JlZmNvdW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gIT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEoaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSB8fCBoYW5kbGUuaXNTeW1ib2woKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIGhhbmRsZS5pZCwgaW5pdGlhbF9yZWZjb3VudCA+Pj4gMCwgMSAvKiBPd25lcnNoaXAua1VzZXJsYW5kICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHJlZi5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfcmVmZXJlbmNlKGVudiwgcmVmKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWZlcmVuY2VfcmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikucmVmKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmZXJlbmNlX3VucmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgdmFyIHJlZmNvdW50ID0gcmVmZXJlbmNlLnJlZkNvdW50KCk7XG4gICAgICAgICAgICBpZiAocmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHJlZmVyZW5jZS51bnJlZigpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY291bnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9yZWZlcmVuY2VfdmFsdWUoZW52LCByZWYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhhbmRsZUlkID0gcmVmZXJlbmNlLmdldCgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgaGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9lbnZfY2xlYW51cF9ob29rKGVudiwgZnVuLCBhcmcpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFmdW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5hZGRDbGVhbnVwSG9vayhlbnZPYmplY3QsIGZ1biwgYXJnKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVtb3ZlX2Vudl9jbGVhbnVwX2hvb2soZW52LCBmdW4sIGFyZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWZ1bilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlbW92ZUNsZWFudXBIb29rKGVudk9iamVjdCwgZnVuLCBhcmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X3JlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2Vudl91bnJlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlmZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9yZWY6IF9lbW5hcGlfZW52X3JlZixcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X3VucmVmOiBfZW1uYXBpX2Vudl91bnJlZixcbiAgICAgICAgICAgIG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2s6IG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfY2xvc2VfZXNjYXBhYmxlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlOiBuYXBpX2Nsb3NlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JlZmVyZW5jZTogbmFwaV9jcmVhdGVfcmVmZXJlbmNlLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfcmVmZXJlbmNlOiBuYXBpX2RlbGV0ZV9yZWZlcmVuY2UsXG4gICAgICAgICAgICBuYXBpX2VzY2FwZV9oYW5kbGU6IG5hcGlfZXNjYXBlX2hhbmRsZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3JlZmVyZW5jZV92YWx1ZTogbmFwaV9nZXRfcmVmZXJlbmNlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfb3Blbl9lc2NhcGFibGVfaGFuZGxlX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2hhbmRsZV9zY29wZTogbmFwaV9vcGVuX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfcmVmZXJlbmNlX3JlZjogbmFwaV9yZWZlcmVuY2VfcmVmLFxuICAgICAgICAgICAgbmFwaV9yZWZlcmVuY2VfdW5yZWY6IG5hcGlfcmVmZXJlbmNlX3VucmVmLFxuICAgICAgICAgICAgbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9vazogbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9va1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X2ZpbGVuYW1lKGVudiwgYnVmLCBsZW4pIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBlbnZPYmplY3QuZmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGZpbGVuYW1lLCBidWYsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pc2NlbGxhbmVvdXNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfZmlsZW5hbWU6IF9lbW5hcGlfZ2V0X2ZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcHJvbWlzZShlbnYsIGRlZmVycmVkLCBwcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3RJZCwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZlcnJlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb21pc2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZmVycmVkT2JqZWN0ID0gZW1uYXBpQ3R4LmNyZWF0ZURlZmVycmVkKHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkT2JqZWN0SWQgPSBkZWZlcnJlZE9iamVjdC5pZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGVmZXJyZWQsIGRlZmVycmVkT2JqZWN0SWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShwKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihwcm9taXNlLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZXNvbHZlX2RlZmVycmVkKGVudiwgZGVmZXJyZWQsIHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x1dGlvbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3QgPSBlbW5hcGlDdHguZGVmZXJyZWRTdG9yZS5nZXQoZGVmZXJyZWQpO1xuICAgICAgICAgICAgICAgIGRlZmVycmVkT2JqZWN0LnJlc29sdmUoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyZXNvbHV0aW9uKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWplY3RfZGVmZXJyZWQoZW52LCBkZWZlcnJlZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZGVmZXJyZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHV0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZE9iamVjdCA9IGVtbmFwaUN0eC5kZWZlcnJlZFN0b3JlLmdldChkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3QucmVqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfcHJvbWlzZShlbnYsIHZhbHVlLCBpc19wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWlzX3Byb21pc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNQcm9taXNlKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGlzX3Byb21pc2UsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3Byb21pc2U6IG5hcGlfY3JlYXRlX3Byb21pc2UsXG4gICAgICAgICAgICBuYXBpX2lzX3Byb21pc2U6IG5hcGlfaXNfcHJvbWlzZSxcbiAgICAgICAgICAgIG5hcGlfcmVqZWN0X2RlZmVycmVkOiBuYXBpX3JlamVjdF9kZWZlcnJlZCxcbiAgICAgICAgICAgIG5hcGlfcmVzb2x2ZV9kZWZlcnJlZDogbmFwaV9yZXNvbHZlX2RlZmVycmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcGlpaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCBrZXlfbW9kZSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBvYmogPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlfbW9kZSAhPT0gMCAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfaW5jbHVkZV9wcm90b3R5cGVzICovICYmIGtleV9tb2RlICE9PSAxIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9vd25fb25seSAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5X2NvbnZlcnNpb24gIT09IDAgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9rZWVwX251bWJlcnMgKi8gJiYga2V5X2NvbnZlcnNpb24gIT09IDEgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9udW1iZXJzX3RvX3N0cmluZ3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG5hbWVzID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBzeW1ib2xzID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBpID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBvd24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBpbnRlZ2VySW5kaWNlUmVnZXggPSAvXigwfFsxLTldWzAtOV0qKSQvO1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmopO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVnZXJJbmRpY2VSZWdleC50ZXN0KG5hbWVzW2ldKSA/IE51bWJlcihuYW1lc1tpXSkgOiBuYW1lc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZXNbaV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bjogb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogc3ltYm9sc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltYm9sc1tpXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duOiBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlfbW9kZSA9PT0gMSAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfb3duX29ubHkgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgICAgICAgICAgICAgICBvd24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChvYmopO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYWRkTmFtZSA9IGZ1bmN0aW9uIChyZXQsIG5hbWUsIGtleV9maWx0ZXIsIGNvbnZlcnNpb25fbW9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0LmluZGV4T2YobmFtZSkgIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVyc2lvbl9tb2RlID09PSAwIC8qIG5hcGlfa2V5X2NvbnZlcnNpb24ubmFwaV9rZXlfa2VlcF9udW1iZXJzICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb252ZXJzaW9uX21vZGUgPT09IDEgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9udW1iZXJzX3RvX3N0cmluZ3MgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWFsTmFtZSA9IHR5cGVvZiBuYW1lID09PSAnbnVtYmVyJyA/IFN0cmluZyhuYW1lKSA6IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlYWxOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGtleV9maWx0ZXIgJiA4IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9za2lwX3N0cmluZ3MgKi8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHJlYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChyZWFsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gcHJvcC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHByb3AuZGVzYztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9maWx0ZXIgPT09IDAgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2FsbF9wcm9wZXJ0aWVzICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lKHJldCwgbmFtZV8xLCBrZXlfZmlsdGVyLCBrZXlfY29udmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciAmIDggLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3RyaW5ncyAqLyAmJiB0eXBlb2YgbmFtZV8xID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9maWx0ZXIgJiAxNiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zeW1ib2xzICovICYmIHR5cGVvZiBuYW1lXzEgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkQWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5X2ZpbHRlciAmIDcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3dyaXRhYmxlICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovKToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2Mud3JpdGFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfY29uZmlndXJhYmxlICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoNCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfY29uZmlndXJhYmxlICovIHwgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovKToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2MuY29uZmlndXJhYmxlICYmIGRlc2MuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovIHwgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlICYmIGRlc2Mud3JpdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmFtZShyZXQsIG5hbWVfMSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShyZXQpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfcHJvcGVydHlfbmFtZXMoZW52LCBvYmplY3QsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lcyhlbnYsIG9iamVjdCwgMCAvKiBuYXBpX2tleV9jb2xsZWN0aW9uX21vZGUubmFwaV9rZXlfaW5jbHVkZV9wcm90b3R5cGVzICovLCAyIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9lbnVtZXJhYmxlICovIHwgMTYgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3ltYm9scyAqLywgMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoLnZhbHVlW2VtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZV0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9oYXNfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHZbZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlLZXkgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGgudmFsdWUsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZGVsZXRlIGgudmFsdWVbcHJvcGVydHlLZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX293bl9wcm9wZXJ0eShlbnYsIG9iamVjdCwga2V5LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIGNuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFjbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCkudmFsdWVbZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjbmFtZSwgLTEpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2hhc19uYW1lZF9wcm9wZXJ0eShlbnYsIG9iamVjdCwgdXRmOG5hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGY4bmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSkgaW4gdjtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eShlbnYsIG9iamVjdCwgdXRmOG5hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSldKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmICghKGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGgudmFsdWVbaW5kZXggPj4+IDBdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX2VsZW1lbnQoZW52LCBvYmplY3QsIGluZGV4LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgciA9ICgoaW5kZXggPj4+IDApIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2VsZW1lbnQoZW52LCBvYmplY3QsIGluZGV4LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh2W2luZGV4ID4+PiAwXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHIgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGgudmFsdWUsIGluZGV4ID4+PiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZGVsZXRlIGgudmFsdWVbaW5kZXggPj4+IDBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVmaW5lX3Byb3BlcnRpZXMoZW52LCBvYmplY3QsIHByb3BlcnR5X2NvdW50LCBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcHJvcFB0ciwgYXR0cmlidXRlcztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIG1heWJlT2JqZWN0ID0gaC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMiA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzIpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgbWF5YmVPYmplY3QsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfb2JqZWN0X2ZyZWV6ZShlbnYsIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9zZWFsKGVudiwgb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIG1heWJlT2JqZWN0ID0gaC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3Quc2VhbChtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJvcGVydHlNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9kZWZpbmVfcHJvcGVydGllczogbmFwaV9kZWZpbmVfcHJvcGVydGllcyxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2VsZW1lbnQ6IG5hcGlfZGVsZXRlX2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2RlbGV0ZV9wcm9wZXJ0eTogbmFwaV9kZWxldGVfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9hbGxfcHJvcGVydHlfbmFtZXM6IG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lcyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2VsZW1lbnQ6IG5hcGlfZ2V0X2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eTogbmFwaV9nZXRfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9wcm9wZXJ0eTogbmFwaV9nZXRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lczogbmFwaV9nZXRfcHJvcGVydHlfbmFtZXMsXG4gICAgICAgICAgICBuYXBpX2hhc19lbGVtZW50OiBuYXBpX2hhc19lbGVtZW50LFxuICAgICAgICAgICAgbmFwaV9oYXNfbmFtZWRfcHJvcGVydHk6IG5hcGlfaGFzX25hbWVkX3Byb3BlcnR5LFxuICAgICAgICAgICAgbmFwaV9oYXNfb3duX3Byb3BlcnR5OiBuYXBpX2hhc19vd25fcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2hhc19wcm9wZXJ0eTogbmFwaV9oYXNfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX29iamVjdF9mcmVlemU6IG5hcGlfb2JqZWN0X2ZyZWV6ZSxcbiAgICAgICAgICAgIG5hcGlfb2JqZWN0X3NlYWw6IG5hcGlfb2JqZWN0X3NlYWwsXG4gICAgICAgICAgICBuYXBpX3NldF9lbGVtZW50OiBuYXBpX3NldF9lbGVtZW50LFxuICAgICAgICAgICAgbmFwaV9zZXRfbmFtZWRfcHJvcGVydHk6IG5hcGlfc2V0X25hbWVkX3Byb3BlcnR5LFxuICAgICAgICAgICAgbmFwaV9zZXRfcHJvcGVydHk6IG5hcGlfc2V0X3Byb3BlcnR5XG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9ydW5fc2NyaXB0KGVudiwgc2NyaXB0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBzdGF0dXM7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JpcHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHY4U2NyaXB0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIGlmICghdjhTY3JpcHQuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KDUgLyogR2xvYmFsSGFuZGxlLkdMT0JBTCAqLykudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IGcuZXZhbCh2OFNjcmlwdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzY3JpcHRNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9ydW5fc2NyaXB0OiBuYXBpX3J1bl9zY3JpcHRcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3R5cGVvZihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAodi5pc051bWJlcigpKSB7XG4gICAgICAgICAgICAgICAgciA9IDMgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9udW1iZXIgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzQmlnSW50KCkpIHtcbiAgICAgICAgICAgICAgICByID0gOSAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2JpZ2ludCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNTdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgIHIgPSA0IC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfc3RyaW5nICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGNvbWUgYmVmb3JlIElzT2JqZWN0IGJlY2F1c2UgSXNGdW5jdGlvblxuICAgICAgICAgICAgICAgIC8vIGltcGxpZXMgSXNPYmplY3RcbiAgICAgICAgICAgICAgICByID0gNyAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2Z1bmN0aW9uICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0V4dGVybmFsKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgaGFzIHRvIGNvbWUgYmVmb3JlIElzT2JqZWN0IGJlY2F1c2UgSXNFeHRlcm5hbFxuICAgICAgICAgICAgICAgIC8vIGltcGxpZXMgSXNPYmplY3RcbiAgICAgICAgICAgICAgICByID0gOCAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX2V4dGVybmFsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc09iamVjdCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDYgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9vYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzQm9vbGVhbigpKSB7XG4gICAgICAgICAgICAgICAgciA9IDIgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9ib29sZWFuICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc1VuZGVmaW5lZCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDAgLyogbmFwaV92YWx1ZXR5cGUubmFwaV91bmRlZmluZWQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzU3ltYm9sKCkpIHtcbiAgICAgICAgICAgICAgICByID0gNSAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX3N5bWJvbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNOdWxsKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgciA9IDEgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9udWxsICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBnZXQgaGVyZSB1bmxlc3MgVjggaGFzIGFkZGVkIHNvbWUgbmV3IGtpbmQgb2YgdmFsdWUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZSA/IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8gOiAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fbnVtYmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IGEgQmlnSW50IHZhbHVlIHRvIGEgbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKE51bWJlcihoYW5kbGUudmFsdWUpKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fb2JqZWN0KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPT09IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChPYmplY3QoaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY29lcmNlX3RvX3N0cmluZyhlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuaXNTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTdHJpbmcoaGFuZGxlLnZhbHVlKSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2luc3RhbmNlb2YoZW52LCBvYmplY3QsIGNvbnN0cnVjdG9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID09PSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLyA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIGN0b3IgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIWN0b3IuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDUgLyogbmFwaV9zdGF0dXMubmFwaV9mdW5jdGlvbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2YWwgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCkudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IHZhbCBpbnN0YW5jZW9mIGN0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgciA9IHJldCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2FycmF5KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNBcnJheSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2FycmF5YnVmZmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNBcnJheUJ1ZmZlcigpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2RhdGUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0RhdGUoKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19lcnJvcihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgdmFsID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9ICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfdHlwZWRhcnJheShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzVHlwZWRBcnJheSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2J1ZmZlcihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzQnVmZmVyKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGF0YXZpZXcoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0RhdGFWaWV3KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3N0cmljdF9lcXVhbHMoZW52LCBsaHMsIHJocywgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxocylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJocylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgbHYgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGxocykudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIHJ2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChyaHMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHIgPSAobHYgPT09IHJ2KSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZXRhY2hfYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFhcnJheWJ1ZmZlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcikudmFsdWU7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgKHZhbHVlIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIwIC8qIG5hcGlfc3RhdHVzLm5hcGlfZGV0YWNoYWJsZV9hcnJheWJ1ZmZlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDE5IC8qIG5hcGlfc3RhdHVzLm5hcGlfYXJyYXlidWZmZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlQ2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbF8xKCk7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodmFsdWUsIFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19kZXRhY2hlZF9hcnJheWJ1ZmZlcihlbnYsIGFycmF5YnVmZmVyLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA9PT0gMjE0NzQ4MzY0NyAvKiBWZXJzaW9uLk5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgKi8gPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoaC5pc0FycmF5QnVmZmVyKCkgJiYgaC52YWx1ZS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVPcGVyYXRpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fYm9vbDogbmFwaV9jb2VyY2VfdG9fYm9vbCxcbiAgICAgICAgICAgIG5hcGlfY29lcmNlX3RvX251bWJlcjogbmFwaV9jb2VyY2VfdG9fbnVtYmVyLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fb2JqZWN0OiBuYXBpX2NvZXJjZV90b19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX2NvZXJjZV90b19zdHJpbmc6IG5hcGlfY29lcmNlX3RvX3N0cmluZyxcbiAgICAgICAgICAgIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyOiBuYXBpX2RldGFjaF9hcnJheWJ1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfaW5zdGFuY2VvZjogbmFwaV9pbnN0YW5jZW9mLFxuICAgICAgICAgICAgbmFwaV9pc19hcnJheTogbmFwaV9pc19hcnJheSxcbiAgICAgICAgICAgIG5hcGlfaXNfYXJyYXlidWZmZXI6IG5hcGlfaXNfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2J1ZmZlcjogbmFwaV9pc19idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2RhdGF2aWV3OiBuYXBpX2lzX2RhdGF2aWV3LFxuICAgICAgICAgICAgbmFwaV9pc19kYXRlOiBuYXBpX2lzX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyOiBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9pc19lcnJvcjogbmFwaV9pc19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfaXNfdHlwZWRhcnJheTogbmFwaV9pc190eXBlZGFycmF5LFxuICAgICAgICAgICAgbmFwaV9zdHJpY3RfZXF1YWxzOiBuYXBpX3N0cmljdF9lcXVhbHMsXG4gICAgICAgICAgICBuYXBpX3R5cGVvZjogbmFwaV90eXBlb2ZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZlcnNpb24oZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSA5IC8qIFZlcnNpb24uTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZlcnNpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmVyc2lvbjogbmFwaV9nZXRfdmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgZW1uYXBpQVdTVC5pbml0KCk7XG4gICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LmluaXQoKTtcbiAgICAgICAgZW1uYXBpU3RyaW5nLmluaXQoKTtcbiAgICAgICAgZW1uYXBpVFNGTi5pbml0KCk7XG4gICAgICAgIG5hcGlNb2R1bGUuZW1uYXBpLnN5bmNNZW1vcnkgPSAkZW1uYXBpU3luY01lbW9yeTtcbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuZ2V0TWVtb3J5QWRkcmVzcyA9ICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzO1xuICAgICAgICBmdW5jdGlvbiBhZGRJbXBvcnRzKG1vZCkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhtb2QpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChrLmluZGV4T2YoJyQnKSA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZignZW1uYXBpXycpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGlba10gPSBtb2Rba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGsuaW5kZXhPZignX2VtbmFwaV8nKSA9PT0gMCB8fCBrID09PSAnbmFwaV9zZXRfbGFzdF9lcnJvcicgfHwgayA9PT0gJ25hcGlfY2xlYXJfbGFzdF9lcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVudltrXSA9IG1vZFtrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpW2tdID0gbW9kW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZGRJbXBvcnRzKGFzeW5jTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhtZW1vcnlNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGFzeW5jV29ya01vZCk7XG4gICAgICAgIGFkZEltcG9ydHModXRpbE1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoY29udmVydDJjTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhjb252ZXJ0Mm5hcGlNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGNyZWF0ZU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZ2xvYmFsTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh3cmFwTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhlbnZNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGVtbmFwaU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZXJyb3JNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGZ1bmN0aW9uTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhsaWZlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhtaXNjZWxsYW5lb3VzTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhub2RlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhwcm9taXNlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhwcm9wZXJ0eU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoc2NyaXB0TW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh2YWx1ZU9wZXJhdGlvbk1vZCk7XG4gICAgICAgIGFkZEltcG9ydHModmVyc2lvbk1vZCk7XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2NyZWF0ZV90aHJlYWRzYWZlX2Z1bmN0aW9uO1xuICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMubmFwaS5uYXBpX2dldF90aHJlYWRzYWZlX2Z1bmN0aW9uX2NvbnRleHQgPSBuYXBpX2dldF90aHJlYWRzYWZlX2Z1bmN0aW9uX2NvbnRleHQ7XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfY2FsbF90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfYWNxdWlyZV90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9hY3F1aXJlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfcmVsZWFzZV90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9yZWxlYXNlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfcmVmX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIHJldHVybiBuYXBpTW9kdWxlO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIG5hcGlNb2R1bGU7XG59XG5cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlSW1wbChsb2FkRm4sIHVzZXJOYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1hc3NlcnRpb25zXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IHt9O1xuICAgIHZhciBnZXRNZW1vcnkgPSBvcHRpb25zLmdldE1lbW9yeTtcbiAgICB2YXIgZ2V0VGFibGUgPSBvcHRpb25zLmdldFRhYmxlO1xuICAgIHZhciBiZWZvcmVJbml0ID0gb3B0aW9ucy5iZWZvcmVJbml0O1xuICAgIGlmIChnZXRNZW1vcnkgIT0gbnVsbCAmJiB0eXBlb2YgZ2V0TWVtb3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuZ2V0TWVtb3J5IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGlmIChnZXRUYWJsZSAhPSBudWxsICYmIHR5cGVvZiBnZXRUYWJsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmdldFRhYmxlIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGlmIChiZWZvcmVJbml0ICE9IG51bGwgJiYgdHlwZW9mIGJlZm9yZUluaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5iZWZvcmVJbml0IGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIHZhciBuYXBpTW9kdWxlO1xuICAgIHZhciBpc0xvYWQgPSB0eXBlb2YgdXNlck5hcGlNb2R1bGUgPT09ICdvYmplY3QnICYmIHVzZXJOYXBpTW9kdWxlICE9PSBudWxsO1xuICAgIGlmIChpc0xvYWQpIHtcbiAgICAgICAgaWYgKHVzZXJOYXBpTW9kdWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduYXBpTW9kdWxlIGhhcyBhbHJlYWR5IGxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIG5hcGlNb2R1bGUgPSB1c2VyTmFwaU1vZHVsZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG5hcGlNb2R1bGUgPSBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpO1xuICAgIH1cbiAgICB2YXIgd2FzaSA9IG9wdGlvbnMud2FzaTtcbiAgICB2YXIgaW1wb3J0T2JqZWN0ID0ge1xuICAgICAgICBlbnY6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYsXG4gICAgICAgIG5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLFxuICAgICAgICBlbW5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGksXG4gICAgICAgIHdhc2k6IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICAgICAgICAgICd0aHJlYWQtc3Bhd24nOiBmdW5jdGlvbiBfX2ltcG9ydGVkX3dhc2lfdGhyZWFkX3NwYXduKHN0YXJ0QXJnLCBlcnJvck9yVGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hcGlNb2R1bGUuc3Bhd25UaHJlYWQoc3RhcnRBcmcsIGVycm9yT3JUaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAod2FzaSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGltcG9ydE9iamVjdCwgdHlwZW9mIHdhc2kuZ2V0SW1wb3J0T2JqZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHdhc2kuZ2V0SW1wb3J0T2JqZWN0KClcbiAgICAgICAgICAgIDogeyB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpLndhc2lJbXBvcnQgfSk7XG4gICAgfVxuICAgIHZhciBvdmVyd3JpdGVJbXBvcnRzID0gb3B0aW9ucy5vdmVyd3JpdGVJbXBvcnRzO1xuICAgIGlmICh0eXBlb2Ygb3ZlcndyaXRlSW1wb3J0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbmV3SW1wb3J0T2JqZWN0ID0gb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG5ld0ltcG9ydE9iamVjdCA9PT0gJ29iamVjdCcgJiYgbmV3SW1wb3J0T2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpbXBvcnRPYmplY3QgPSBuZXdJbXBvcnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRGbih3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgZnVuY3Rpb24gKGVyciwgc291cmNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3JpZ2luYWxJbnN0YW5jZSA9IHNvdXJjZS5pbnN0YW5jZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gb3JpZ2luYWxJbnN0YW5jZTtcbiAgICAgICAgdmFyIG9yaWdpbmFsRXhwb3J0cyA9IG9yaWdpbmFsSW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgdmFyIGV4cG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIG9yaWdpbmFsRXhwb3J0cztcbiAgICAgICAgdmFyIGltcG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIGltcG9ydE9iamVjdC5lbnY7XG4gICAgICAgIHZhciBtZW1vcnkgPSBnZXRNZW1vcnlcbiAgICAgICAgICAgID8gZ2V0TWVtb3J5KG9yaWdpbmFsRXhwb3J0cylcbiAgICAgICAgICAgIDogZXhwb3J0TWVtb3J5XG4gICAgICAgICAgICAgICAgPyBvcmlnaW5hbEV4cG9ydHMubWVtb3J5XG4gICAgICAgICAgICAgICAgOiBpbXBvcnRNZW1vcnlcbiAgICAgICAgICAgICAgICAgICAgPyBpbXBvcnRPYmplY3QuZW52Lm1lbW9yeVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb3J5IGlzIG5laXRoZXIgZXhwb3J0ZWQgbm9yIGltcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUgPyBnZXRUYWJsZShvcmlnaW5hbEV4cG9ydHMpIDogb3JpZ2luYWxFeHBvcnRzLl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGU7XG4gICAgICAgIGlmICh3YXNpICYmICFleHBvcnRNZW1vcnkpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRzXzEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleHBvcnRzXzEsIG9yaWdpbmFsRXhwb3J0cywgeyBtZW1vcnk6IG1lbW9yeSB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0geyBleHBvcnRzOiBleHBvcnRzXzEgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kdWxlID0gc291cmNlLm1vZHVsZTtcbiAgICAgICAgaWYgKHdhc2kpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9oZWxwL2lzc3Vlcy80MTAyXG4gICAgICAgICAgICAgICAgdmFyIGNyZWF0ZUhhbmRsZXIgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcHBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29uc3RydWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVQcm9wZXJ0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZGVsZXRlUHJvcGVydHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdnZXRQcm90b3R5cGVPZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaGFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVuc2libGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ293bktleXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRFeHRlbnNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NldFByb3RvdHlwZU9mJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gaGFuZGxlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyW25hbWVfMV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MudW5zaGlmdCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0W25hbWVfMV0uYXBwbHkoUmVmbGVjdCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBjcmVhdGVIYW5kbGVyKG9yaWdpbmFsRXhwb3J0cyk7XG4gICAgICAgICAgICAgICAgdmFyIG5vb3BfMSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmdldCA9IGZ1bmN0aW9uIChfdGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gJ21lbW9yeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09ICdfaW5pdGlhbGl6ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub29wXzE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9yaWdpbmFsRXhwb3J0cywgcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGV4cG9ydHNQcm94eV8xID0gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCksIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFByb3h5KGluc3RhbmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKHRhcmdldCwgcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwID09PSAnZXhwb3J0cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0c1Byb3h5XzE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhc2kuaW5pdGlhbGl6ZShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZUluaXQpIHtcbiAgICAgICAgICAgIGJlZm9yZUluaXQoe1xuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBvcmlnaW5hbEluc3RhbmNlLFxuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBuYXBpTW9kdWxlLmluaXQoe1xuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICBtZW1vcnk6IG1lbW9yeSxcbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHJldCA9IHsgaW5zdGFuY2U6IG9yaWdpbmFsSW5zdGFuY2UsIG1vZHVsZTogbW9kdWxlIH07XG4gICAgICAgIGlmICghaXNMb2FkKSB7XG4gICAgICAgICAgICByZXQubmFwaU1vZHVsZSA9IG5hcGlNb2R1bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxvYWRDYWxsYmFjayh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbG9hZCh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCkudGhlbihmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBsb2FkU3luY0NhbGxiYWNrKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0LCBjYWxsYmFjaykge1xuICAgIHZhciBzb3VyY2U7XG4gICAgdHJ5IHtcbiAgICAgICAgc291cmNlID0gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRPYmplY3QpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgc291cmNlKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBsb2FkTmFwaU1vZHVsZShuYXBpTW9kdWxlLCBcbi8qKiBPbmx5IHN1cHBvcnQgYEJ1ZmZlclNvdXJjZWAgb3IgYFdlYkFzc2VtYmx5Lk1vZHVsZWAgb24gTm9kZS5qcyAqL1xud2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBuYXBpTW9kdWxlICE9PSAnb2JqZWN0JyB8fCBuYXBpTW9kdWxlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbmFwaU1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRDYWxsYmFjaywgbmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBsb2FkTmFwaU1vZHVsZVN5bmMobmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBuYXBpTW9kdWxlICE9PSAnb2JqZWN0JyB8fCBuYXBpTW9kdWxlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbmFwaU1vZHVsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRTeW5jQ2FsbGJhY2ssIG5hcGlNb2R1bGUsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gaW5zdGFudGlhdGVOYXBpTW9kdWxlKFxuLyoqIE9ubHkgc3VwcG9ydCBgQnVmZmVyU291cmNlYCBvciBgV2ViQXNzZW1ibHkuTW9kdWxlYCBvbiBOb2RlLmpzICovXG53YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRDYWxsYmFjaywgdW5kZWZpbmVkLCB3YXNtSW5wdXQsIG9wdGlvbnMpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMod2FzbUlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGxvYWROYXBpTW9kdWxlSW1wbChsb2FkU3luY0NhbGxiYWNrLCB1bmRlZmluZWQsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG5cbi8qKiBAcHVibGljICovXG52YXIgTWVzc2FnZUhhbmRsZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIob3B0aW9ucykge1xuICAgICAgICB2YXIgb25Mb2FkID0gb3B0aW9ucy5vbkxvYWQ7XG4gICAgICAgIGlmICh0eXBlb2Ygb25Mb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLm9uTG9hZCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Mb2FkID0gb25Mb2FkO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyB0aGlzLm1vZHVsZSA9IHVuZGVmaW5lZFxuICAgICAgICB0aGlzLm5hcGlNb2R1bGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgfVxuICAgIE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZS5kYXRhLl9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkXzEgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIG9uTG9hZCA9IHRoaXMub25Mb2FkO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gb25Mb2FkKHBheWxvYWRfMSk7XG4gICAgICAgICAgICAgICAgdmFyIHRoZW4gPSBzb3VyY2UgJiYgJ3RoZW4nIGluIHNvdXJjZSA/IHNvdXJjZS50aGVuIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgIHRoZW4uY2FsbChzb3VyY2UsIGZ1bmN0aW9uIChzb3VyY2UpIHsgb25Mb2FkZWQuY2FsbChfdGhpcywgc291cmNlKTsgfSwgZnVuY3Rpb24gKGVycikgeyB0aHJvdyBlcnI7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb25Mb2FkZWQuY2FsbCh0aGlzLCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVBZnRlckxvYWQuY2FsbCh0aGlzLCBlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm5hcGlNb2R1bGUuc3RhcnRUaHJlYWQocGF5bG9hZF8xLnRpZCwgcGF5bG9hZF8xLmFyZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29ya2VyLWluaXQnKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQWZ0ZXJMb2FkLmNhbGwodGhpcywgZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5uYXBpTW9kdWxlLmluaXRXb3JrZXIocGF5bG9hZF8xLmFyZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1leGVjdXRlJykge1xuICAgICAgICAgICAgICAgIGhhbmRsZUFmdGVyTG9hZC5jYWxsKHRoaXMsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrKHBheWxvYWRfMS53b3JrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1lc3NhZ2VIYW5kbGVyO1xufSgpKTtcbmZ1bmN0aW9uIGhhbmRsZUFmdGVyTG9hZChlLCBmKSB7XG4gICAgaWYgKHRoaXMuaW5zdGFuY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmLmNhbGwodGhpcywgZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLm1lc3NhZ2VzQmVmb3JlTG9hZC5wdXNoKGUuZGF0YSk7XG4gICAgfVxufVxuZnVuY3Rpb24gb25Mb2FkZWQoc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29uTG9hZCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICB2YXIgaW5zdGFuY2UgPSBzb3VyY2UuaW5zdGFuY2U7XG4gICAgdmFyIG5hcGlNb2R1bGUgPSBzb3VyY2UubmFwaU1vZHVsZTtcbiAgICBpZiAoIWluc3RhbmNlKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvbkxvYWQgc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaW5jbHVkZXMgXCJpbnN0YW5jZVwiJyk7XG4gICAgaWYgKCFuYXBpTW9kdWxlKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvbkxvYWQgc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaW5jbHVkZXMgXCJuYXBpTW9kdWxlXCInKTtcbiAgICBpZiAoIW5hcGlNb2R1bGUuY2hpbGRUaHJlYWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmFwaU1vZHVsZSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGBjaGlsZFRocmVhZDogdHJ1ZWAnKTtcbiAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgdGhpcy5uYXBpTW9kdWxlID0gbmFwaU1vZHVsZTtcbiAgICB2YXIgcG9zdE1lc3NhZ2UgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgIHBvc3RNZXNzYWdlKHtcbiAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgdHlwZTogJ2xvYWRlZCcsXG4gICAgICAgICAgICBwYXlsb2FkOiB7fVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQ7XG4gICAgdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBkYXRhID0gbWVzc2FnZXNbaV07XG4gICAgICAgIHRoaXMuaGFuZGxlKHsgZGF0YTogZGF0YSB9KTtcbiAgICB9XG59XG5cbnZhciB2ZXJzaW9uID0gXCIxLjEuMVwiO1xuXG5leHBvcnQgeyBNZXNzYWdlSGFuZGxlciwgY3JlYXRlTmFwaU1vZHVsZSwgaW5zdGFudGlhdGVOYXBpTW9kdWxlLCBpbnN0YW50aWF0ZU5hcGlNb2R1bGVTeW5jLCBsb2FkTmFwaU1vZHVsZSwgbG9hZE5hcGlNb2R1bGVTeW5jLCB2ZXJzaW9uIH07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlO1xuICAgIGlmIChhc3luYykge1xuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IHsgX19leHRlbmRzIH0gZnJvbSAndHNsaWInO1xuXG52YXIgRU1QVFlfQVJHUyA9IFtdO1xudmFyIENhbGxiYWNrSW5mbyA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxsYmFja0luZm8oaWQsIHBhcmVudCwgY2hpbGQsIHRoaXosIGRhdGEsIGFyZ3MsIGZuKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDtcbiAgICAgICAgdGhpcy50aGl6ID0gdGhpejtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICAgICAgdGhpcy5mbiA9IGZuO1xuICAgIH1cbiAgICBDYWxsYmFja0luZm8ucHJvdG90eXBlLmdldE5ld1RhcmdldCA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIHRoaXogPSB0aGlzLnRoaXo7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW9wdGlvbmFsLWNoYWluXG4gICAgICAgIGlmICh0aGl6ID09IG51bGwgfHwgdGhpei5jb25zdHJ1Y3RvciA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiB0aGl6IGluc3RhbmNlb2YgdGhpcy5mbiA/IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh0aGl6LmNvbnN0cnVjdG9yKSA6IDA7XG4gICAgfTtcbiAgICBDYWxsYmFja0luZm8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnRoaXogIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMudGhpeiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5hcmdzID0gRU1QVFlfQVJHUztcbiAgICAgICAgdGhpcy5mbiA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gQ2FsbGJhY2tJbmZvO1xufSgpKTtcbnZhciBST09UX0NCSU5GTyA9IG5ldyBDYWxsYmFja0luZm8oMCwgbnVsbCwgbnVsbCwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7XG52YXIgQ2FsbGJhY2tJbmZvU3RhY2sgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2FsbGJhY2tJbmZvU3RhY2soKSB7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFJPT1RfQ0JJTkZPO1xuICAgIH1cbiAgICBDYWxsYmFja0luZm9TdGFjay5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlmIChpZCA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiBST09UX0NCSU5GTy5jaGlsZDtcbiAgICAgICAgdmFyIGluZm8gPSBST09UX0NCSU5GTztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZDsgKytpKSB7XG4gICAgICAgICAgICBpbmZvID0gaW5mby5jaGlsZDtcbiAgICAgICAgICAgIGlmIChpbmZvID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvID09PSBST09UX0NCSU5GTyA/IG51bGwgOiBpbmZvO1xuICAgIH07XG4gICAgQ2FsbGJhY2tJbmZvU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ID09PSBST09UX0NCSU5GTylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgICAgIGN1cnJlbnQuZGlzcG9zZSgpO1xuICAgIH07XG4gICAgQ2FsbGJhY2tJbmZvU3RhY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodGhpeiwgZGF0YSwgYXJncywgZm4pIHtcbiAgICAgICAgdmFyIGluZm8gPSB0aGlzLmN1cnJlbnQuY2hpbGQ7XG4gICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICBpbmZvLnRoaXogPSB0aGl6O1xuICAgICAgICAgICAgaW5mby5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGluZm8uYXJncyA9IGFyZ3M7XG4gICAgICAgICAgICBpbmZvLmZuID0gZm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmZvID0gbmV3IENhbGxiYWNrSW5mbyh0aGlzLmN1cnJlbnQuaWQgKyAxLCB0aGlzLmN1cnJlbnQsIG51bGwsIHRoaXosIGRhdGEsIGFyZ3MsIGZuKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5jaGlsZCA9IGluZm87XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gaW5mbztcbiAgICAgICAgcmV0dXJuIGluZm8uaWQ7XG4gICAgfTtcbiAgICBDYWxsYmFja0luZm9TdGFjay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBDYWxsYmFja0luZm9TdGFjaztcbn0oKSk7XG5cbnZhciBzdXBwb3J0TmV3RnVuY3Rpb24gPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGY7XG4gICAgdHJ5IHtcbiAgICAgICAgZiA9IG5ldyBGdW5jdGlvbigpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJztcbn0pKCk7XG52YXIgX2dsb2JhbCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gZ2xvYmFsVGhpcztcbiAgICB2YXIgZyA9IChmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KSgpO1xuICAgIGlmICghZyAmJiBzdXBwb3J0TmV3RnVuY3Rpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGcgPSBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgfVxuICAgIGlmICghZykge1xuICAgICAgICBpZiAodHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cbiAgICByZXR1cm4gZztcbn0pKCk7XG52YXIgVHJ5Q2F0Y2ggPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJ5Q2F0Y2goKSB7XG4gICAgICAgIHRoaXMuX2V4Y2VwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY2F1Z2h0ID0gZmFsc2U7XG4gICAgfVxuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2NhdWdodDtcbiAgICB9O1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5oYXNDYXVnaHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXVnaHQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuZXhjZXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjZXB0aW9uO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLnNldEVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICB0aGlzLl9jYXVnaHQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSBlcnI7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NhdWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuZXh0cmFjdEV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGUgPSB0aGlzLl9leGNlcHRpb247XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJ5Q2F0Y2g7XG59KCkpO1xudmFyIGNhblNldEZ1bmN0aW9uTmFtZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX2E7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oKF9hID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb25maWd1cmFibGUpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSkoKTtcbnZhciBzdXBwb3J0UmVmbGVjdCA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JztcbnZhciBzdXBwb3J0RmluYWxpemVyID0gKHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgV2Vha1JlZiAhPT0gJ3VuZGVmaW5lZCcpO1xudmFyIHN1cHBvcnRXZWFrU3ltYm9sID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzeW1ib2wtZGVzY3JpcHRpb25cbiAgICAgICAgdmFyIHN5bSA9IFN5bWJvbCgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgIG5ldyBXZWFrUmVmKHN5bSk7XG4gICAgICAgIG5ldyBXZWFrTWFwKCkuc2V0KHN5bSwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0pKCk7XG52YXIgc3VwcG9ydEJpZ0ludCA9IHR5cGVvZiBCaWdJbnQgIT09ICd1bmRlZmluZWQnO1xuZnVuY3Rpb24gaXNSZWZlcmVuY2VUeXBlKHYpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsKSB8fCB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJztcbn1cbnZhciBfcmVxdWlyZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmF0aXZlUmVxdWlyZTtcbiAgICBpZiAodHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBuYXRpdmVSZXF1aXJlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgX19ub25fd2VicGFja19yZXF1aXJlX18gIT09ICd1bmRlZmluZWQnID8gX19ub25fd2VicGFja19yZXF1aXJlX18gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBuYXRpdmVSZXF1aXJlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gIT09ICd1bmRlZmluZWQnID8gKHR5cGVvZiBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyAhPT0gJ3VuZGVmaW5lZCcgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHVuZGVmaW5lZCkgOiAodHlwZW9mIHJlcXVpcmUgIT09ICd1bmRlZmluZWQnID8gcmVxdWlyZSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVSZXF1aXJlO1xufSkoKTtcbnZhciBfTWVzc2FnZUNoYW5uZWwgPSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICdmdW5jdGlvbidcbiAgICA/IE1lc3NhZ2VDaGFubmVsXG4gICAgOiAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJykuTWVzc2FnZUNoYW5uZWw7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pKCk7XG52YXIgX3NldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbidcbiAgICA/IHNldEltbWVkaWF0ZVxuICAgIDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9NZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgICAgICAgdmFyIGNoYW5uZWxfMSA9IG5ldyBfTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbF8xLnBvcnQxLm9ubWVzc2FnZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2hhbm5lbF8xID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2hhbm5lbF8xLnBvcnQyLnBvc3RNZXNzYWdlKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgMCk7XG4gICAgICAgIH1cbiAgICB9O1xudmFyIF9CdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nXG4gICAgPyBCdWZmZXJcbiAgICA6IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBfcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSgpO1xudmFyIHZlcnNpb24gPSBcIjEuMS4xXCI7XG52YXIgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUlOID0gMSAvKiBWZXJzaW9uLk5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiAqLztcbnZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSA5IC8qIFZlcnNpb24uTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYICovO1xudmFyIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgPSAyMTQ3NDgzNjQ3IC8qIFZlcnNpb24uTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAqLztcbnZhciBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTiA9IDggLyogVmVyc2lvbi5OT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTiAqLztcblxudmFyIEhhbmRsZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBIYW5kbGUoaWQsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBIYW5kbGUucHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0T2JqZWN0QmluZGluZyh0aGlzLnZhbHVlKS5kYXRhO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc051bWJlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnbnVtYmVyJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCaWdJbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdmdW5jdGlvbic7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRXh0ZXJuYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2VUeXBlKHRoaXMudmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLnZhbHVlKSA9PT0gbnVsbCk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdvYmplY3QnICYmIHRoaXMudmFsdWUgIT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy52YWx1ZSkpICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgX0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBfQnVmZmVyLmlzQnVmZmVyKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0RhdGFWaWV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBEYXRhVmlldyk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQm9vbGVhbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVW5kZWZpbmVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1N5bWJvbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnc3ltYm9sJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNOdWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gbnVsbDtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGU7XG59KCkpO1xudmFyIENvbnN0SGFuZGxlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDb25zdEhhbmRsZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDb25zdEhhbmRsZShpZCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGlkLCB2YWx1ZSkgfHwgdGhpcztcbiAgICB9XG4gICAgQ29uc3RIYW5kbGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgcmV0dXJuIENvbnN0SGFuZGxlO1xufShIYW5kbGUpKTtcbmZ1bmN0aW9uIEV4dGVybmFsKCkge1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBudWxsKTtcbn1cbkV4dGVybmFsLnByb3RvdHlwZSA9IG51bGw7XG52YXIgSGFuZGxlU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGFuZGxlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlVOREVGSU5FRCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLk5VTEwsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5GQUxTRSxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlRSVUUsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5HTE9CQUxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5fbmV4dCA9IEhhbmRsZVN0b3JlLk1JTl9JRDtcbiAgICB9XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgaWYgKG5leHQgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoID0gdmFsdWVzW25leHRdO1xuICAgICAgICAgICAgaC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaCA9IG5ldyBIYW5kbGUobmV4dCwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVzW25leHRdID0gaDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZXh0Kys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmVyYXNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IHN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzW2ldLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIEhhbmRsZVN0b3JlLnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgdmFyIGggPSB2YWx1ZXNbYV07XG4gICAgICAgIHZhbHVlc1thXSA9IHZhbHVlc1tiXTtcbiAgICAgICAgdmFsdWVzW2FdLmlkID0gTnVtYmVyKGEpO1xuICAgICAgICB2YWx1ZXNbYl0gPSBoO1xuICAgICAgICBoLmlkID0gTnVtYmVyKGIpO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgICAgIHRoaXMuX25leHQgPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgfTtcbiAgICBIYW5kbGVTdG9yZS5VTkRFRklORUQgPSBuZXcgQ29uc3RIYW5kbGUoMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovLCB1bmRlZmluZWQpO1xuICAgIEhhbmRsZVN0b3JlLk5VTEwgPSBuZXcgQ29uc3RIYW5kbGUoMiAvKiBHbG9iYWxIYW5kbGUuTlVMTCAqLywgbnVsbCk7XG4gICAgSGFuZGxlU3RvcmUuRkFMU0UgPSBuZXcgQ29uc3RIYW5kbGUoMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8sIGZhbHNlKTtcbiAgICBIYW5kbGVTdG9yZS5UUlVFID0gbmV3IENvbnN0SGFuZGxlKDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8sIHRydWUpO1xuICAgIEhhbmRsZVN0b3JlLkdMT0JBTCA9IG5ldyBDb25zdEhhbmRsZSg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8sIF9nbG9iYWwpO1xuICAgIEhhbmRsZVN0b3JlLk1JTl9JRCA9IDY7XG4gICAgcmV0dXJuIEhhbmRsZVN0b3JlO1xufSgpKTtcblxudmFyIEhhbmRsZVNjb3BlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZVNjb3BlKGhhbmRsZVN0b3JlLCBpZCwgcGFyZW50U2NvcGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IHN0YXJ0OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBoYW5kbGVTdG9yZTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFNjb3BlO1xuICAgICAgICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlICE9PSBudWxsKVxuICAgICAgICAgICAgcGFyZW50U2NvcGUuY2hpbGQgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLl9lc2NhcGVDYWxsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaCA9IHRoaXMuaGFuZGxlU3RvcmUucHVzaCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmFkZEV4dGVybmFsID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZGF0YSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBuZXcgRXh0ZXJuYWwoKTtcbiAgICAgICAgdmFyIGggPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLnB1c2godmFsdWUpO1xuICAgICAgICB2YXIgYmluZGluZyA9IGVudk9iamVjdC5pbml0T2JqZWN0QmluZGluZyh2YWx1ZSk7XG4gICAgICAgIGJpbmRpbmcuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmVuZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5lcmFzZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuX2VzY2FwZUNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChoYW5kbGUgPCB0aGlzLnN0YXJ0IHx8IGhhbmRsZSA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5zd2FwKGhhbmRsZSwgdGhpcy5zdGFydCk7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5nZXQodGhpcy5zdGFydCk7XG4gICAgICAgIHRoaXMuc3RhcnQrKztcbiAgICAgICAgdGhpcy5wYXJlbnQuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmVzY2FwZUNhbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VzY2FwZUNhbGxlZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGVTY29wZTtcbn0oKSk7XG5cbnZhciBTY29wZVN0b3JlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RTY29wZSA9IG5ldyBIYW5kbGVTY29wZShudWxsLCAwLCBudWxsLCAxLCBIYW5kbGVTdG9yZS5NSU5fSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICB9XG4gICAgU2NvcGVTdG9yZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIGlkID0gTnVtYmVyKGlkKTtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gdGhpcy5fcm9vdFNjb3BlKSB7XG4gICAgICAgICAgICBpZiAoc2NvcGUuaWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUgPSBzY29wZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB2YXIgc2NvcGUgPSBjdXJyZW50U2NvcGUuY2hpbGQ7XG4gICAgICAgIGlmIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuc3RhcnQgPSBzY29wZS5lbmQgPSBjdXJyZW50U2NvcGUuZW5kO1xuICAgICAgICAgICAgc2NvcGUuX2VzY2FwZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2NvcGUgPSBuZXcgSGFuZGxlU2NvcGUoZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZSwgY3VycmVudFNjb3BlLmlkICsgMSwgY3VycmVudFNjb3BlLCBjdXJyZW50U2NvcGUuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHNjb3BlO1xuICAgICAgICBlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcysrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTY29wZVN0b3JlLnByb3RvdHlwZS5jbG9zZVNjb3BlID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICBpZiAoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHNjb3BlLnBhcmVudDtcbiAgICAgICAgc2NvcGUuZGlzcG9zZSgpO1xuICAgICAgICBlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3Blcy0tO1xuICAgIH07XG4gICAgU2NvcGVTdG9yZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuaGFuZGxlU3RvcmUgPSBudWxsO1xuICAgICAgICAgICAgc2NvcGUuaWQgPSAwO1xuICAgICAgICAgICAgc2NvcGUucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgIHNjb3BlLnN0YXJ0ID0gSGFuZGxlU3RvcmUuTUlOX0lEO1xuICAgICAgICAgICAgc2NvcGUuZW5kID0gSGFuZGxlU3RvcmUuTUlOX0lEO1xuICAgICAgICAgICAgc2NvcGUuX2VzY2FwZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gc2NvcGUuY2hpbGQ7XG4gICAgICAgICAgICBzY29wZS5jaGlsZCA9IG51bGw7XG4gICAgICAgICAgICBzY29wZSA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBTY29wZVN0b3JlO1xufSgpKTtcblxudmFyIFJlZlRyYWNrZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVmVHJhY2tlcigpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ByZXYgPSBudWxsO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fcHJldiA9IGxpc3Q7XG4gICAgICAgIHRoaXMuX25leHQgPSBsaXN0Ll9uZXh0O1xuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5fbmV4dCA9IHRoaXM7XG4gICAgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2Ll9uZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXMuX3ByZXY7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgIH07XG4gICAgUmVmVHJhY2tlci5maW5hbGl6ZUFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHdoaWxlIChsaXN0Ll9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaXN0Ll9uZXh0LmZpbmFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZUcmFja2VyO1xufSgpKTtcblxudmFyIEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaW5hbGl6ZXIoZW52T2JqZWN0LCBfZmluYWxpemVDYWxsYmFjaywgX2ZpbmFsaXplRGF0YSwgX2ZpbmFsaXplSGludCkge1xuICAgICAgICBpZiAoX2ZpbmFsaXplQ2FsbGJhY2sgPT09IHZvaWQgMCkgeyBfZmluYWxpemVDYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKF9maW5hbGl6ZURhdGEgPT09IHZvaWQgMCkgeyBfZmluYWxpemVEYXRhID0gMDsgfVxuICAgICAgICBpZiAoX2ZpbmFsaXplSGludCA9PT0gdm9pZCAwKSB7IF9maW5hbGl6ZUhpbnQgPSAwOyB9XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrID0gX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IF9maW5hbGl6ZURhdGE7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IF9maW5hbGl6ZUhpbnQ7XG4gICAgfVxuICAgIEZpbmFsaXplci5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrOyB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplRGF0YTsgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLmhpbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9maW5hbGl6ZUhpbnQ7IH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5yZXNldEZpbmFsaXplciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZmluYWxpemVDYWxsYmFjayA9IDA7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IDA7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IDA7XG4gICAgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgcmV0dXJuIEZpbmFsaXplcjtcbn0oKSk7XG5cbnZhciBUcmFja2VkRmluYWxpemVyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUcmFja2VkRmluYWxpemVyLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFRyYWNrZWRGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fbmV4dCA9IG51bGw7XG4gICAgICAgIF90aGlzLl9wcmV2ID0gbnVsbDtcbiAgICAgICAgX3RoaXMubGluayghZmluYWxpemVfY2FsbGJhY2sgPyBlbnZPYmplY3QucmVmbGlzdCA6IGVudk9iamVjdC5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFRyYWNrZWRGaW5hbGl6ZXIuZmluYWxpemVBbGwgPSBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICBSZWZUcmFja2VyLmZpbmFsaXplQWxsKGxpc3QpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUubGluayA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIFJlZlRyYWNrZXIucHJvdG90eXBlLmxpbmsuY2FsbCh0aGlzLCBsaXN0KTtcbiAgICB9O1xuICAgIFRyYWNrZWRGaW5hbGl6ZXIucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUmVmVHJhY2tlci5wcm90b3R5cGUudW5saW5rLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBUcmFja2VkRmluYWxpemVyLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhY2tlZEZpbmFsaXplcihlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIFRyYWNrZWRGaW5hbGl6ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0LmRlcXVldWVGaW5hbGl6ZXIodGhpcyk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmluYWxpemVDb3JlKHRydWUpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemVDb3JlID0gZnVuY3Rpb24gKGRlbGV0ZU1lKSB7XG4gICAgICAgIHZhciBmaW5hbGl6ZV9jYWxsYmFjayA9IHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHZhciBmaW5hbGl6ZV9kYXRhID0gdGhpcy5fZmluYWxpemVEYXRhO1xuICAgICAgICB2YXIgZmluYWxpemVfaGludCA9IHRoaXMuX2ZpbmFsaXplSGludDtcbiAgICAgICAgdGhpcy5yZXNldEZpbmFsaXplcigpO1xuICAgICAgICB0aGlzLnVubGluaygpO1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIHZhciBjYXVnaHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZmluaSA9IE51bWJlcihmaW5hbGl6ZV9jYWxsYmFjayk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXIoZmluaSwgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVsZXRlTWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplcjtcbn0oRmluYWxpemVyKSk7XG5cbnZhciBSZWZCYXNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZCYXNlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlZkJhc2UoZW52T2JqZWN0LCBpbml0aWFsX3JlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGVudk9iamVjdCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLl9yZWZjb3VudCA9IGluaXRpYWxfcmVmY291bnQ7XG4gICAgICAgIF90aGlzLl9vd25lcnNoaXAgPSBvd25lcnNoaXA7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmQmFzZS5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplRGF0YTtcbiAgICB9O1xuICAgIFJlZkJhc2UucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICsrdGhpcy5fcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLS10aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZkJhc2UucHJvdG90eXBlLnJlZkNvdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS5vd25lcnNoaXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vd25lcnNoaXA7XG4gICAgfTtcbiAgICBSZWZCYXNlLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvcmUodGhpcy5fb3duZXJzaGlwID09PSAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLyk7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmQmFzZTtcbn0oVHJhY2tlZEZpbmFsaXplcikpO1xuXG5mdW5jdGlvbiB0aHJvd05vZGVBcGlWZXJzaW9uRXJyb3IobW9kdWxlTmFtZSwgbW9kdWxlQXBpVmVyc2lvbikge1xuICAgIHZhciBlcnJvck1lc3NhZ2UgPSBcIlwiLmNvbmNhdChtb2R1bGVOYW1lLCBcIiByZXF1aXJlcyBOb2RlLUFQSSB2ZXJzaW9uIFwiKS5jb25jYXQobW9kdWxlQXBpVmVyc2lvbiwgXCIsIGJ1dCB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBvbmx5IHN1cHBvcnRzIHZlcnNpb24gXCIpLmNvbmNhdChOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIFwiIGFkZC1vbnMuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gaGFuZGxlVGhyb3coZW52T2JqZWN0LCB2YWx1ZSkge1xuICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IHZhbHVlO1xufVxudmFyIEVudiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnYoY3R4LCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9IG1vZHVsZUFwaVZlcnNpb247XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnBwcCA9IG1ha2VEeW5DYWxsX3ZwcHA7XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnAgPSBtYWtlRHluQ2FsbF92cDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgICAgICB0aGlzLm9wZW5IYW5kbGVTY29wZXMgPSAwO1xuICAgICAgICB0aGlzLmluc3RhbmNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2ggPSBuZXcgVHJ5Q2F0Y2goKTtcbiAgICAgICAgdGhpcy5yZWZzID0gMTtcbiAgICAgICAgdGhpcy5yZWZsaXN0ID0gbmV3IFJlZlRyYWNrZXIoKTtcbiAgICAgICAgdGhpcy5maW5hbGl6aW5nX3JlZmxpc3QgPSBuZXcgUmVmVHJhY2tlcigpO1xuICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzID0gW107XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0ge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8sXG4gICAgICAgICAgICBlbmdpbmVFcnJvckNvZGU6IDAsXG4gICAgICAgICAgICBlbmdpbmVSZXNlcnZlZDogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmluZGluZ01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS50ZXJtaW5hdGVkT3JUZXJtaW5hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlZnMrKztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVmcy0tO1xuICAgICAgICBpZiAodGhpcy5yZWZzID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5lbnN1cmVIYW5kbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmVuc3VyZUhhbmRsZSh2YWx1ZSk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmVuc3VyZUhhbmRsZUlkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZUhhbmRsZSh2YWx1ZSkuaWQ7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNsZWFyTGFzdEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdEVycm9yID0gdGhpcy5sYXN0RXJyb3I7XG4gICAgICAgIGlmIChsYXN0RXJyb3IuZXJyb3JDb2RlICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSAhPT0gMClcbiAgICAgICAgICAgIGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgPSAwO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSAwKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkID0gMDtcbiAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuc2V0TGFzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKGVuZ2luZV9lcnJvcl9jb2RlID09PSB2b2lkIDApIHsgZW5naW5lX2Vycm9yX2NvZGUgPSAwOyB9XG4gICAgICAgIGlmIChlbmdpbmVfcmVzZXJ2ZWQgPT09IHZvaWQgMCkgeyBlbmdpbmVfcmVzZXJ2ZWQgPSAwOyB9XG4gICAgICAgIHZhciBsYXN0RXJyb3IgPSB0aGlzLmxhc3RFcnJvcjtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lcnJvckNvZGUgIT09IGVycm9yX2NvZGUpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gZXJyb3JfY29kZTtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgIT09IGVuZ2luZV9lcnJvcl9jb2RlKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA9IGVuZ2luZV9lcnJvcl9jb2RlO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSBlbmdpbmVfcmVzZXJ2ZWQpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZW5naW5lUmVzZXJ2ZWQgPSBlbmdpbmVfcmVzZXJ2ZWQ7XG4gICAgICAgIHJldHVybiBlcnJvcl9jb2RlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRSZXR1cm5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyA6IHRoaXMuc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5jYWxsSW50b01vZHVsZSA9IGZ1bmN0aW9uIChmbiwgaGFuZGxlRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChoYW5kbGVFeGNlcHRpb24gPT09IHZvaWQgMCkgeyBoYW5kbGVFeGNlcHRpb24gPSBoYW5kbGVUaHJvdzsgfVxuICAgICAgICB2YXIgb3BlbkhhbmRsZVNjb3Blc0JlZm9yZSA9IHRoaXMub3BlbkhhbmRsZVNjb3BlcztcbiAgICAgICAgdGhpcy5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB2YXIgciA9IGZuKHRoaXMpO1xuICAgICAgICBpZiAob3BlbkhhbmRsZVNjb3Blc0JlZm9yZSAhPT0gdGhpcy5vcGVuSGFuZGxlU2NvcGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdvcGVuX2hhbmRsZV9zY29wZXMgIT0gb3Blbl9oYW5kbGVfc2NvcGVzX2JlZm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gdGhpcy50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24odGhpcywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIEVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB2YXIgZiA9IHRoaXMubWFrZUR5bkNhbGxfdnBwcChjYik7XG4gICAgICAgIHZhciBlbnYgPSB0aGlzLmlkO1xuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzLmN0eC5vcGVuU2NvcGUodGhpcyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxJbnRvTW9kdWxlKGZ1bmN0aW9uICgpIHsgZihlbnYsIGRhdGEsIGhpbnQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuY3R4LmNsb3NlU2NvcGUodGhpcywgc2NvcGUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmludm9rZUZpbmFsaXplckZyb21HQyA9IGZ1bmN0aW9uIChmaW5hbGl6ZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQXBpVmVyc2lvbiAhPT0gTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCkge1xuICAgICAgICAgICAgdGhpcy5lbnF1ZXVlRmluYWxpemVyKGZpbmFsaXplcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgc2F2ZWQgPSB0aGlzLmluR2NGaW5hbGl6ZXI7XG4gICAgICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZXIuZmluYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5HY0ZpbmFsaXplciA9IHNhdmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNoZWNrR0NBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZHVsZUFwaVZlcnNpb24gPT09IE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwgJiYgdGhpcy5pbkdjRmluYWxpemVyKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdGaW5hbGl6ZXIgaXMgY2FsbGluZyBhIGZ1bmN0aW9uIHRoYXQgbWF5IGFmZmVjdCBHQyBzdGF0ZS5cXG4nICtcbiAgICAgICAgICAgICAgICAnVGhlIGZpbmFsaXplcnMgYXJlIHJ1biBkaXJlY3RseSBmcm9tIEdDIGFuZCBtdXN0IG5vdCBhZmZlY3QgR0MgJyArXG4gICAgICAgICAgICAgICAgJ3N0YXRlLlxcbicgK1xuICAgICAgICAgICAgICAgICdVc2UgYG5vZGVfYXBpX3Bvc3RfZmluYWxpemVyYCBmcm9tIGluc2lkZSBvZiB0aGUgZmluYWxpemVyIHRvIHdvcmsgJyArXG4gICAgICAgICAgICAgICAgJ2Fyb3VuZCB0aGlzIGlzc3VlLlxcbicgK1xuICAgICAgICAgICAgICAgICdJdCBzY2hlZHVsZXMgdGhlIGNhbGwgYXMgYSBuZXcgdGFzayBpbiB0aGUgZXZlbnQgbG9vcC4nKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgRW52LnByb3RvdHlwZS5lbnF1ZXVlRmluYWxpemVyID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRmluYWxpemVycy5pbmRleE9mKGZpbmFsaXplcikgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLnB1c2goZmluYWxpemVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgRW52LnByb3RvdHlwZS5kZXF1ZXVlRmluYWxpemVyID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLmluZGV4T2YoZmluYWxpemVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nRmluYWxpemVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmRlbGV0ZU1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBSZWZCYXNlLmZpbmFsaXplQWxsKHRoaXMuZmluYWxpemluZ19yZWZsaXN0KTtcbiAgICAgICAgUmVmQmFzZS5maW5hbGl6ZUFsbCh0aGlzLnJlZmxpc3QpO1xuICAgICAgICB0aGlzLnRyeUNhdGNoLmV4dHJhY3RFeGNlcHRpb24oKTtcbiAgICAgICAgdGhpcy5jdHguZW52U3RvcmUucmVtb3ZlKHRoaXMuaWQpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pZCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5kZWxldGVNZSgpO1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuaW5pdE9iamVjdEJpbmRpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSB7XG4gICAgICAgICAgICB3cmFwcGVkOiAwLFxuICAgICAgICAgICAgdGFnOiBudWxsLFxuICAgICAgICAgICAgZGF0YTogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nTWFwLnNldCh2YWx1ZSwgYmluZGluZyk7XG4gICAgICAgIHJldHVybiBiaW5kaW5nO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9iaW5kaW5nTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nTWFwLmdldCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdE9iamVjdEJpbmRpbmcodmFsdWUpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5zZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlRGF0YS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZURhdGEgPSBuZXcgUmVmQmFzZSh0aGlzLCAwLCAwIC8qIE93bmVyc2hpcC5rUnVudGltZSAqLywgZmluYWxpemVfY2IsIGRhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlRGF0YSA/IHRoaXMuaW5zdGFuY2VEYXRhLmRhdGEoKSA6IDA7XG4gICAgfTtcbiAgICByZXR1cm4gRW52O1xufSgpKTtcbnZhciBOb2RlRW52ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb2RlRW52LCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE5vZGVFbnYoY3R4LCBmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0LCBub2RlQmluZGluZykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBjdHgsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgX3RoaXMubm9kZUJpbmRpbmcgPSBub2RlQmluZGluZztcbiAgICAgICAgX3RoaXMuZGVzdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICAgICAgX3RoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgTm9kZUVudi5wcm90b3R5cGUuZGVsZXRlTWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZGVzdHJ1Y3RpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZWxldGVNZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FuQ2FsbEludG9KcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuY2FuQ2FsbEludG9Kcy5jYWxsKHRoaXMpICYmIHRoaXMuY3R4LmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLnRyaWdnZXJGYXRhbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKHRoaXMubm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZUJpbmRpbmcubmFwaS5mYXRhbEV4Y2VwdGlvbihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzLl9mYXRhbEV4Y2VwdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVkID0gcHJvY2Vzcy5fZmF0YWxFeGNlcHRpb24oZXJyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsYmFja0ludG9Nb2R1bGUgPSBmdW5jdGlvbiAoZW5mb3JjZVVuY2F1Z2h0RXhjZXB0aW9uUG9saWN5LCBmbikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsSW50b01vZHVsZShmbiwgZnVuY3Rpb24gKGVudk9iamVjdCwgZXJyKSB7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0LnRlcm1pbmF0ZWRPclRlcm1pbmF0aW5nKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGFzUHJvY2VzcyA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsO1xuICAgICAgICAgICAgdmFyIGhhc0ZvcmNlRmxhZyA9IGhhc1Byb2Nlc3MgPyBCb29sZWFuKHByb2Nlc3MuZXhlY0FyZ3YgJiYgKHByb2Nlc3MuZXhlY0FyZ3YuaW5kZXhPZignLS1mb3JjZS1ub2RlLWFwaS11bmNhdWdodC1leGNlcHRpb25zLXBvbGljeScpICE9PSAtMSkpIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPCBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICYmICFoYXNGb3JjZUZsYWcgJiYgIWVuZm9yY2VVbmNhdWdodEV4Y2VwdGlvblBvbGljeSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXJuID0gaGFzUHJvY2VzcyAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IHByb2Nlc3MuZW1pdFdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAod2FybmluZywgdHlwZSwgY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IGNvZGUgPyBcIltcIi5jb25jYXQoY29kZSwgXCJdIFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdCh0eXBlIHx8ICdXYXJuaW5nJywgXCI6IFwiKS5jb25jYXQod2FybmluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdhcm4oJ1VuY2F1Z2h0IE4tQVBJIGNhbGxiYWNrIGV4Y2VwdGlvbiBkZXRlY3RlZCwgcGxlYXNlIHJ1biBub2RlIHdpdGggb3B0aW9uIC0tZm9yY2Utbm9kZS1hcGktdW5jYXVnaHQtZXhjZXB0aW9ucy1wb2xpY3k9dHJ1ZSB0byBoYW5kbGUgdGhvc2UgZXhjZXB0aW9ucyBwcm9wZXJseS4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgJ0RFUDAxNjgnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnZPYmplY3QudHJpZ2dlckZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB0aGlzLmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgxLCBjYiwgZGF0YSwgaGludCk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsRmluYWxpemVySW50ZXJuYWwgPSBmdW5jdGlvbiAoZm9yY2VVbmNhdWdodCwgY2IsIGRhdGEsIGhpbnQpIHtcbiAgICAgICAgdmFyIGYgPSB0aGlzLm1ha2VEeW5DYWxsX3ZwcHAoY2IpO1xuICAgICAgICB2YXIgZW52ID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdHgub3BlblNjb3BlKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0ludG9Nb2R1bGUoQm9vbGVhbihmb3JjZVVuY2F1Z2h0KSwgZnVuY3Rpb24gKCkgeyBmKGVudiwgZGF0YSwgaGludCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZW5xdWV1ZUZpbmFsaXplci5jYWxsKHRoaXMsIGZpbmFsaXplcik7XG4gICAgICAgIGlmICghdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgJiYgIXRoaXMuZGVzdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmKCk7XG4gICAgICAgICAgICBfc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfdGhpcy51bnJlZigpO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5kcmFpbkZpbmFsaXplclF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nRmluYWxpemVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmVmVHJhY2tlciA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJlZlRyYWNrZXIuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5vZGVFbnY7XG59KEVudikpO1xuZnVuY3Rpb24gbmV3RW52KGN0eCwgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpIHtcbiAgICBtb2R1bGVBcGlWZXJzaW9uID0gdHlwZW9mIG1vZHVsZUFwaVZlcnNpb24gIT09ICdudW1iZXInID8gTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gOiBtb2R1bGVBcGlWZXJzaW9uO1xuICAgIC8vIFZhbGlkYXRlIG1vZHVsZV9hcGlfdmVyc2lvbi5cbiAgICBpZiAobW9kdWxlQXBpVmVyc2lvbiA8IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OKSB7XG4gICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kdWxlQXBpVmVyc2lvbiA+IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAmJiBtb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgIHRocm93Tm9kZUFwaVZlcnNpb25FcnJvcihmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbik7XG4gICAgfVxuICAgIHZhciBlbnYgPSBuZXcgTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICBjdHguZW52U3RvcmUuYWRkKGVudik7XG4gICAgY3R4LmFkZENsZWFudXBIb29rKGVudiwgZnVuY3Rpb24gKCkgeyBlbnYudW5yZWYoKTsgfSwgMCk7XG4gICAgcmV0dXJuIGVudjtcbn1cblxudmFyIEVtbmFwaUVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbW5hcGlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbW5hcGlFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSBfbmV3VGFyZ2V0O1xuICAgICAgICB2YXIgcHJvdG8gPSBFcnJvckNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCEoX3RoaXMgaW5zdGFuY2VvZiBFbW5hcGlFcnJvcikpIHtcbiAgICAgICAgICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm90b3R5cGVPZi5jYWxsKE9iamVjdCwgX3RoaXMsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgICAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbW5hcGlFcnJvcjtcbn0oRXJyb3IpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbW5hcGlFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ0VtbmFwaUVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydFdlYWtSZWZFcnJvciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm90U3VwcG9ydFdlYWtSZWZFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJGaW5hbGl6YXRpb25SZWdpc3RyeVxcXCIgYW5kIFxcXCJXZWFrUmVmXFxcIi5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yO1xufShFbW5hcGlFcnJvcikpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IucHJvdG90eXBlLCAnbmFtZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICdOb3RTdXBwb3J0V2Vha1JlZkVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb3RTdXBwb3J0QnVmZmVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm90U3VwcG9ydEJ1ZmZlckVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJCdWZmZXJcXFwiLiBDb25zaWRlciB1c2luZyBidWZmZXIgcG9seWZpbGwgdG8gbWFrZSBzdXJlIGBnbG9iYWxUaGlzLkJ1ZmZlcmAgaXMgZGVmaW5lZC5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0QnVmZmVyRXJyb3I7XG59KEVtbmFwaUVycm9yKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTm90U3VwcG9ydEJ1ZmZlckVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnTm90U3VwcG9ydEJ1ZmZlckVycm9yJ1xufSk7XG5cbnZhciBTdHJvbmdSZWYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3Ryb25nUmVmKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGVyZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9O1xuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3Ryb25nUmVmO1xufSgpKTtcbnZhciBQZXJzaXN0ZW50ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNpc3RlbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcmVmID0gbmV3IFN0cm9uZ1JlZih2YWx1ZSk7XG4gICAgfVxuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLnNldFdlYWsgPSBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yZWYgaW5zdGFuY2VvZiBXZWFrUmVmKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHZhbHVlLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgIHZhciB3ZWFrUmVmID0gbmV3IFdlYWtSZWYodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZiA9IHdlYWtSZWY7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50LnByb3RvdHlwZS5jbGVhcldlYWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX3JlZiBpbnN0YW5jZW9mIFdlYWtSZWYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgUGVyc2lzdGVudC5fcmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgIHRoaXMuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYgPSBuZXcgU3Ryb25nUmVmKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUGVyc2lzdGVudC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5fcmVmIGluc3RhbmNlb2YgU3Ryb25nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZiA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmRlcmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVmID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmLmRlcmVmKCk7XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50Ll9yZWdpc3RyeSA9IHN1cHBvcnRGaW5hbGl6ZXJcbiAgICAgICAgPyBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5fcmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdmFsdWUuX2NhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gdmFsdWUuX3BhcmFtO1xuICAgICAgICAgICAgdmFsdWUuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFsdWUuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFBlcnNpc3RlbnQ7XG59KCkpO1xuXG5mdW5jdGlvbiB3ZWFrQ2FsbGJhY2socmVmKSB7XG4gICAgcmVmLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICByZWYuZW52T2JqZWN0Lmludm9rZUZpbmFsaXplckZyb21HQyhyZWYpO1xufVxuZnVuY3Rpb24gY2FuQmVIZWxkV2Vha2x5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpIHx8IHZhbHVlLmlzU3ltYm9sKCk7XG59XG52YXIgUmVmZXJlbmNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZlcmVuY2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKGVudk9iamVjdCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjayA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2NhbGxiYWNrID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfZGF0YSA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2RhdGEgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9oaW50ID09PSB2b2lkIDApIHsgZmluYWxpemVfaGludCA9IDA7IH1cbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZW52T2JqZWN0LCBpbml0aWFsUmVmY291bnQgPj4+IDAsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmlkID0gMDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZWZlcmVuY2UuY3JlYXRlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrID09PSB2b2lkIDApIHsgZmluYWxpemVfY2FsbGJhY2sgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9kYXRhID09PSB2b2lkIDApIHsgZmluYWxpemVfZGF0YSA9IDA7IH1cbiAgICAgICAgaWYgKGZpbmFsaXplX2hpbnQgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9oaW50ID0gMDsgfVxuICAgICAgICB2YXIgaGFuZGxlID0gZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZS5nZXQoaGFuZGxlX2lkKTtcbiAgICAgICAgdmFyIHJlZiA9IG5ldyBSZWZlcmVuY2UoZW52T2JqZWN0LCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICBlbnZPYmplY3QuY3R4LnJlZlN0b3JlLmFkZChyZWYpO1xuICAgICAgICByZWYuY2FuQmVXZWFrID0gY2FuQmVIZWxkV2Vha2x5KGhhbmRsZSk7XG4gICAgICAgIHJlZi5wZXJzaXN0ZW50ID0gbmV3IFBlcnNpc3RlbnQoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgaWYgKGluaXRpYWxSZWZjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmVmLl9zZXRXZWFrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5wZXJzaXN0ZW50LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvdW50ID0gX3N1cGVyLnByb3RvdHlwZS5yZWYuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKGNvdW50ID09PSAxICYmIHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuY2xlYXJXZWFrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvbGRSZWZjb3VudCA9IHRoaXMucmVmQ291bnQoKTtcbiAgICAgICAgdmFyIHJlZmNvdW50ID0gX3N1cGVyLnByb3RvdHlwZS51bnJlZi5jYWxsKHRoaXMpO1xuICAgICAgICBpZiAob2xkUmVmY291bnQgPT09IDEgJiYgcmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFdlYWsoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmY291bnQ7XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmogPSB0aGlzLnBlcnNpc3RlbnQuZGVyZWYoKTtcbiAgICAgICAgdmFyIGhhbmRsZSA9IHRoaXMuZW52T2JqZWN0LmVuc3VyZUhhbmRsZShvYmopO1xuICAgICAgICByZXR1cm4gaGFuZGxlLmlkO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5fc2V0V2VhayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuc2V0V2Vhayh0aGlzLCB3ZWFrQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wZXJzaXN0ZW50LnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucGVyc2lzdGVudC5yZXNldCgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmZpbmFsaXplLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgdGhpcy5lbnZPYmplY3QuY3R4LnJlZlN0b3JlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH07XG4gICAgcmV0dXJuIFJlZmVyZW5jZTtcbn0oUmVmQmFzZSkpO1xuXG52YXIgRGVmZXJyZWQgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRGVmZXJyZWQoY3R4LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgRGVmZXJyZWQuY3JlYXRlID0gZnVuY3Rpb24gKGN0eCwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGRlZmVycmVkID0gbmV3IERlZmVycmVkKGN0eCwgdmFsdWUpO1xuICAgICAgICBjdHguZGVmZXJyZWRTdG9yZS5hZGQoZGVmZXJyZWQpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWQ7XG4gICAgfTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9O1xuICAgIERlZmVycmVkLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRoaXMudmFsdWUucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3R4LmRlZmVycmVkU3RvcmUucmVtb3ZlKHRoaXMuaWQpO1xuICAgICAgICB0aGlzLmlkID0gMDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY3R4ID0gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBEZWZlcnJlZDtcbn0oKSk7XG5cbnZhciBTdG9yZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTdG9yZSgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSA0O1xuICAgICAgICB0aGlzLl9zaXplID0gMTtcbiAgICAgICAgdGhpcy5fZnJlZUxpc3QgPSBbXTtcbiAgICB9XG4gICAgU3RvcmUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB2YXIgaWQ7XG4gICAgICAgIGlmICh0aGlzLl9mcmVlTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5fZnJlZUxpc3Quc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5fc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgICAgIHZhciBjYXBhY2l0eSA9IHRoaXMuX3ZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoaWQgPj0gY2FwYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gY2FwYWNpdHkgKyAoY2FwYWNpdHkgPj4gMSkgKyAxNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YWx1ZS5pZCA9IGlkO1xuICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdmFsdWU7XG4gICAgfTtcbiAgICBTdG9yZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbaWRdO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXSAhPT0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaWRdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlLmlkID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9mcmVlTGlzdC5wdXNoKE51bWJlcihpZCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTdG9yZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLl9zaXplOyArK2kpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlc1tpXTtcbiAgICAgICAgICAgIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2YWx1ZS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgICAgIHRoaXMuX3NpemUgPSAxO1xuICAgICAgICB0aGlzLl9mcmVlTGlzdCA9IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIFN0b3JlO1xufSgpKTtcblxudmFyIENsZWFudXBIb29rQ2FsbGJhY2sgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xlYW51cEhvb2tDYWxsYmFjayhlbnZPYmplY3QsIGZuLCBhcmcsIG9yZGVyKSB7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLmZuID0gZm47XG4gICAgICAgIHRoaXMuYXJnID0gYXJnO1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgfVxuICAgIHJldHVybiBDbGVhbnVwSG9va0NhbGxiYWNrO1xufSgpKTtcbnZhciBDbGVhbnVwUXVldWUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2xlYW51cFF1ZXVlKCkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3MgPSBbXTtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tDb3VudGVyID0gMDtcbiAgICB9XG4gICAgQ2xlYW51cFF1ZXVlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGggPT09IDA7XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZuLCBhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NsZWFudXBIb29rcy5maWx0ZXIoZnVuY3Rpb24gKGhvb2spIHsgcmV0dXJuIChob29rLmVudk9iamVjdCA9PT0gZW52T2JqZWN0ICYmIGhvb2suZm4gPT09IGZuICYmIGhvb2suYXJnID09PSBhcmcpOyB9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgYWRkIHNhbWUgZm4gYW5kIGFyZyB0d2ljZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5wdXNoKG5ldyBDbGVhbnVwSG9va0NhbGxiYWNrKGVudk9iamVjdCwgZm4sIGFyZywgdGhpcy5fY2xlYW51cEhvb2tDb3VudGVyKyspKTtcbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGhvb2sgPSB0aGlzLl9jbGVhbnVwSG9va3NbaV07XG4gICAgICAgICAgICBpZiAoaG9vay5lbnZPYmplY3QgPT09IGVudk9iamVjdCAmJiBob29rLmZuID09PSBmbiAmJiBob29rLmFyZyA9PT0gYXJnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBob29rcyA9IHRoaXMuX2NsZWFudXBIb29rcy5zbGljZSgpO1xuICAgICAgICBob29rcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAoYi5vcmRlciAtIGEub3JkZXIpOyB9KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNiID0gaG9va3NbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNiLmZuID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNiLmVudk9iamVjdC5tYWtlRHluQ2FsbF92cChjYi5mbikoY2IuYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNiLmZuKGNiLmFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3Muc3BsaWNlKHRoaXMuX2NsZWFudXBIb29rcy5pbmRleE9mKGNiKSwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rQ291bnRlciA9IDA7XG4gICAgfTtcbiAgICByZXR1cm4gQ2xlYW51cFF1ZXVlO1xufSgpKTtcbnZhciBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyKCkge1xuICAgICAgICB0aGlzLnJlZkhhbmRsZSA9IG5ldyBfTWVzc2FnZUNoYW5uZWwoKS5wb3J0MTtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgfVxuICAgIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlci5wcm90b3R5cGUuaW5jcmVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlZkhhbmRsZS5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgfTtcbiAgICBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIucHJvdG90eXBlLmRlY3JlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVmSGFuZGxlLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb3VudC0tO1xuICAgIH07XG4gICAgcmV0dXJuIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcjtcbn0oKSk7XG52YXIgQ29udGV4dCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0KCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9pc1N0b3BwaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NhbkNhbGxJbnRvSnMgPSB0cnVlO1xuICAgICAgICB0aGlzLmVudlN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuc2NvcGVTdG9yZSA9IG5ldyBTY29wZVN0b3JlKCk7XG4gICAgICAgIHRoaXMucmVmU3RvcmUgPSBuZXcgU3RvcmUoKTtcbiAgICAgICAgdGhpcy5kZWZlcnJlZFN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBuZXcgSGFuZGxlU3RvcmUoKTtcbiAgICAgICAgdGhpcy5jYmluZm9TdGFjayA9IG5ldyBDYWxsYmFja0luZm9TdGFjaygpO1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSB7XG4gICAgICAgICAgICBzdXBwb3J0UmVmbGVjdDogc3VwcG9ydFJlZmxlY3QsXG4gICAgICAgICAgICBzdXBwb3J0RmluYWxpemVyOiBzdXBwb3J0RmluYWxpemVyLFxuICAgICAgICAgICAgc3VwcG9ydFdlYWtTeW1ib2w6IHN1cHBvcnRXZWFrU3ltYm9sLFxuICAgICAgICAgICAgc3VwcG9ydEJpZ0ludDogc3VwcG9ydEJpZ0ludCxcbiAgICAgICAgICAgIHN1cHBvcnROZXdGdW5jdGlvbjogc3VwcG9ydE5ld0Z1bmN0aW9uLFxuICAgICAgICAgICAgY2FuU2V0RnVuY3Rpb25OYW1lOiBjYW5TZXRGdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGU6IF9zZXRJbW1lZGlhdGUsXG4gICAgICAgICAgICBCdWZmZXI6IF9CdWZmZXIsXG4gICAgICAgICAgICBNZXNzYWdlQ2hhbm5lbDogX01lc3NhZ2VDaGFubmVsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlID0gbmV3IENsZWFudXBRdWV1ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3Mub25jZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5yZWZDb3VudGVyID0gbmV3IE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgcHJvY2Vzcy5vbmNlKCdiZWZvcmVFeGl0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtZnVuY3Rpb24tcmV0dXJuLXR5cGVcbiAgICBDb250ZXh0LnByb3RvdHlwZS5nZXRSdW50aW1lVmVyc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICAgICAgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYOiBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsXG4gICAgICAgICAgICBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMOiBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMLFxuICAgICAgICAgICAgTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT046IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVOb3RTdXBwb3J0V2Vha1JlZkVycm9yID0gZnVuY3Rpb24gKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoYXBpLCBtZXNzYWdlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvciA9IGZ1bmN0aW9uIChhcGksIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RTdXBwb3J0QnVmZmVyRXJyb3IoYXBpLCBtZXNzYWdlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVJlZmVyZW5jZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIGlmIChmaW5hbGl6ZV9jYWxsYmFjayA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2NhbGxiYWNrID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfZGF0YSA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2RhdGEgPSAwOyB9XG4gICAgICAgIGlmIChmaW5hbGl6ZV9oaW50ID09PSB2b2lkIDApIHsgZmluYWxpemVfaGludCA9IDA7IH1cbiAgICAgICAgcmV0dXJuIFJlZmVyZW5jZS5jcmVhdGUoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWZlcnJlZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRGVmZXJyZWQuY3JlYXRlKHRoaXMsIHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZUVudiA9IGZ1bmN0aW9uIChmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0LCBub2RlQmluZGluZykge1xuICAgICAgICByZXR1cm4gbmV3RW52KHRoaXMsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVRyYWNrZWRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplci5jcmVhdGUoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5nZXRDdXJyZW50U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlU3RvcmUuY3VycmVudFNjb3BlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuYWRkVG9DdXJyZW50U2NvcGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5jdXJyZW50U2NvcGUuYWRkKHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNsb3NlU2NvcGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBfc2NvcGUpIHtcbiAgICAgICAgdGhpcy5zY29wZVN0b3JlLmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmVuc3VyZUhhbmRsZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDogcmV0dXJuIEhhbmRsZVN0b3JlLlVOREVGSU5FRDtcbiAgICAgICAgICAgIGNhc2UgbnVsbDogcmV0dXJuIEhhbmRsZVN0b3JlLk5VTEw7XG4gICAgICAgICAgICBjYXNlIHRydWU6IHJldHVybiBIYW5kbGVTdG9yZS5UUlVFO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTogcmV0dXJuIEhhbmRsZVN0b3JlLkZBTFNFO1xuICAgICAgICAgICAgY2FzZSBfZ2xvYmFsOiByZXR1cm4gSGFuZGxlU3RvcmUuR0xPQkFMO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmFkZENsZWFudXBIb29rID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5hZGQoZW52T2JqZWN0LCBmbiwgYXJnKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnJlbW92ZUNsZWFudXBIb29rID0gZnVuY3Rpb24gKGVudk9iamVjdCwgZm4sIGFyZykge1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5yZW1vdmUoZW52T2JqZWN0LCBmbiwgYXJnKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnJ1bkNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdoaWxlICghdGhpcy5jbGVhbnVwUXVldWUuZW1wdHkoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwUXVldWUuZHJhaW4oKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuaW5jcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5yZWZDb3VudGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaW5jcmVhc2UoKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMucmVmQ291bnRlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmRlY3JlYXNlKCk7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5zZXRDYW5DYWxsSW50b0pzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NhbkNhbGxJbnRvSnMgPSB2YWx1ZTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnNldFN0b3BwaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2lzU3RvcHBpbmcgPSB2YWx1ZTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5DYWxsSW50b0pzICYmICF0aGlzLl9pc1N0b3BwaW5nO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zZXRTdG9wcGluZyh0cnVlKTtcbiAgICAgICAgdGhpcy5zZXRDYW5DYWxsSW50b0pzKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ydW5DbGVhbnVwKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dDtcbn0oKSk7XG52YXIgZGVmYXVsdENvbnRleHQ7XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KCkge1xuICAgIHJldHVybiBuZXcgQ29udGV4dCgpO1xufVxuZnVuY3Rpb24gZ2V0RGVmYXVsdENvbnRleHQoKSB7XG4gICAgaWYgKCFkZWZhdWx0Q29udGV4dCkge1xuICAgICAgICBkZWZhdWx0Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRDb250ZXh0O1xufVxuXG5leHBvcnQgeyBDYWxsYmFja0luZm8sIENhbGxiYWNrSW5mb1N0YWNrLCBDb25zdEhhbmRsZSwgQ29udGV4dCwgRGVmZXJyZWQsIEVtbmFwaUVycm9yLCBFbnYsIEZpbmFsaXplciwgSGFuZGxlLCBIYW5kbGVTY29wZSwgSGFuZGxlU3RvcmUsIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OLCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiwgTm9kZUVudiwgTm90U3VwcG9ydEJ1ZmZlckVycm9yLCBOb3RTdXBwb3J0V2Vha1JlZkVycm9yLCBQZXJzaXN0ZW50LCBSZWZCYXNlLCBSZWZUcmFja2VyLCBSZWZlcmVuY2UsIFNjb3BlU3RvcmUsIFN0b3JlLCBUcmFja2VkRmluYWxpemVyLCBUcnlDYXRjaCwgY3JlYXRlQ29udGV4dCwgZ2V0RGVmYXVsdENvbnRleHQsIGlzUmVmZXJlbmNlVHlwZSwgdmVyc2lvbiB9O1xuIiwiY29uc3QgX1dlYkFzc2VtYmx5ID0gdHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gV2ViQXNzZW1ibHlcbiAgICA6IHR5cGVvZiBXWFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IFdYV2ViQXNzZW1ibHlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5pZiAoIV9XZWJBc3NlbWJseSkge1xuICAgIHRocm93IG5ldyBFcnJvcignV2ViQXNzZW1ibHkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlZC1jb21tZW50ICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGFuIG9iamVjdC4gUmVjZWl2ZWQgJHt2YWx1ZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB2YWx1ZX1gKTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZUFycmF5KHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYW4gYXJyYXkuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBhIGJvb2xlYW4uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtuYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb24uIFJlY2VpdmVkICR7dmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWV9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVVbmRlZmluZWQodmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IG11c3QgYmUgdW5kZWZpbmVkLiBSZWNlaXZlZCAke3ZhbHVlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHZhbHVlfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICEhKG9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nKTtcbn1cbmZ1bmN0aW9uIHdyYXBJbnN0YW5jZUV4cG9ydHMoZXhwb3J0cywgbWFwRm4pIHtcbiAgICBjb25zdCBuZXdFeHBvcnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBleHBvcnRWYWx1ZSA9IGV4cG9ydHNbbmFtZV07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFeHBvcnRzLCBuYW1lLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG1hcEZuKGV4cG9ydFZhbHVlLCBuYW1lKVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3RXhwb3J0cztcbn1cbmZ1bmN0aW9uIHNsZWVwQnJlYWtJZihkZWxheSwgYnJlYWtJZikge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGRlbGF5O1xuICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGVuZCkge1xuICAgICAgICBpZiAoYnJlYWtJZigpKSB7XG4gICAgICAgICAgICByZXQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHVuc2hhcmVkU2xpY2Uodmlldywgc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2aWV3LmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSB8fCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZpZXcuYnVmZmVyLmNvbnN0cnVjdG9yKSA9PT0gJ1tvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdJykpXG4gICAgICAgID8gdmlldy5zbGljZShzdGFydCwgZW5kKVxuICAgICAgICA6IHZpZXcuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG59XG5cbmNvbnN0IGlnbm9yZU5hbWVzID0gW1xuICAgICdhc3luY2lmeV9nZXRfc3RhdGUnLFxuICAgICdhc3luY2lmeV9zdGFydF9yZXdpbmQnLFxuICAgICdhc3luY2lmeV9zdGFydF91bndpbmQnLFxuICAgICdhc3luY2lmeV9zdG9wX3Jld2luZCcsXG4gICAgJ2FzeW5jaWZ5X3N0b3BfdW53aW5kJ1xuXTtcbmZ1bmN0aW9uIHRyeUFsbG9jYXRlKGluc3RhbmNlLCB3YXNtNjQsIHNpemUsIG1hbGxvY05hbWUpIHtcbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV0gIT09ICdmdW5jdGlvbicgfHwgc2l6ZSA8PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3YXNtNjQsXG4gICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgIHN0YXJ0OiB3YXNtNjQgPyAzMiA6IDI0LFxuICAgICAgICAgICAgZW5kOiAxMDI0XG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1hbGxvYyA9IGluc3RhbmNlLmV4cG9ydHNbbWFsbG9jTmFtZV07XG4gICAgY29uc3QgZGF0YVB0ciA9IHdhc202NCA/IE51bWJlcihtYWxsb2MoQmlnSW50KDE2KSArIEJpZ0ludChzaXplKSkpIDogbWFsbG9jKDggKyBzaXplKTtcbiAgICBpZiAoZGF0YVB0ciA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbG9jYXRlIGFzeW5jaWZ5IGRhdGEgZmFpbGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB3YXNtNjRcbiAgICAgICAgPyB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyAxNiwgZW5kOiBkYXRhUHRyICsgMTYgKyBzaXplIH1cbiAgICAgICAgOiB7IHdhc202NCwgZGF0YVB0ciwgc3RhcnQ6IGRhdGFQdHIgKyA4LCBlbmQ6IGRhdGFQdHIgKyA4ICsgc2l6ZSB9O1xufVxuLyoqIEBwdWJsaWMgKi9cbmNsYXNzIEFzeW5jaWZ5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5leHBvcnRzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGFQdHIgPSAwO1xuICAgIH1cbiAgICBpbml0KG1lbW9yeSwgaW5zdGFuY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuZXhwb3J0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3luY2lmeSBoYXMgYmVlbiBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKG1lbW9yeSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5NZW1vcnkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZXF1aXJlIFdlYkFzc2VtYmx5Lk1lbW9yeSBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZ25vcmVOYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHBvcnRzW2lnbm9yZU5hbWVzW2ldXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXN5bmNpZnkgd2FzbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBhZGRyZXNzO1xuICAgICAgICBjb25zdCB3YXNtNjQgPSBCb29sZWFuKG9wdGlvbnMud2FzbTY0KTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnRyeUFsbG9jYXRlKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0ge1xuICAgICAgICAgICAgICAgIHdhc202NCxcbiAgICAgICAgICAgICAgICBkYXRhUHRyOiAxNixcbiAgICAgICAgICAgICAgICBzdGFydDogd2FzbTY0ID8gMzIgOiAyNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDEwMjRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50cnlBbGxvY2F0ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB0cnlBbGxvY2F0ZShpbnN0YW5jZSwgd2FzbTY0LCA0MDk2LCAnbWFsbG9jJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdHJ5QWxsb2NhdGUoaW5zdGFuY2UsIHdhc202NCwgKF9hID0gb3B0aW9ucy50cnlBbGxvY2F0ZS5zaXplKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiA0MDk2LCAoX2IgPSBvcHRpb25zLnRyeUFsbG9jYXRlLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICdtYWxsb2MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFQdHIgPSBhZGRyZXNzLmRhdGFQdHI7XG4gICAgICAgIGlmICh3YXNtNjQpIHtcbiAgICAgICAgICAgIG5ldyBCaWdJbnQ2NEFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFtCaWdJbnQoYWRkcmVzcy5zdGFydCksIEJpZ0ludChhZGRyZXNzLmVuZCldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ldyBJbnQzMkFycmF5KG1lbW9yeS5idWZmZXIsIHRoaXMuZGF0YVB0cikuc2V0KFthZGRyZXNzLnN0YXJ0LCBhZGRyZXNzLmVuZF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhwb3J0cyA9IHRoaXMud3JhcEV4cG9ydHMoZXhwb3J0cywgb3B0aW9ucy53cmFwRXhwb3J0cyk7XG4gICAgICAgIGNvbnN0IGFzeW5jaWZpZWRJbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoX1dlYkFzc2VtYmx5Lkluc3RhbmNlLnByb3RvdHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3luY2lmaWVkSW5zdGFuY2UsICdleHBvcnRzJywgeyB2YWx1ZTogdGhpcy5leHBvcnRzIH0pO1xuICAgICAgICAvLyBPYmplY3Quc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIEluc3RhbmNlLnByb3RvdHlwZSlcbiAgICAgICAgcmV0dXJuIGFzeW5jaWZpZWRJbnN0YW5jZTtcbiAgICB9XG4gICAgYXNzZXJ0U3RhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgIT09IDAgLyogQXN5bmNpZnlTdGF0ZS5OT05FICovKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzeW5jaWZ5IHN0YXRlIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd3JhcEltcG9ydEZ1bmN0aW9uKGYpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGUtbG9vcFxuICAgICAgICAgICAgd2hpbGUgKF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfZ2V0X3N0YXRlKCkgPT09IDIgLyogQXN5bmNpZnlTdGF0ZS5SRVdJTkRJTkcgKi8pIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0b3BfcmV3aW5kKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBpZiAoIWlzUHJvbWlzZUxpa2UodikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgICAgICBfdGhpcy5leHBvcnRzLmFzeW5jaWZ5X3N0YXJ0X3Vud2luZChfdGhpcy5kYXRhUHRyKTtcbiAgICAgICAgICAgIF90aGlzLnZhbHVlID0gdjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdyYXBJbXBvcnRzKGltcG9ydHMpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0T2JqZWN0ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGltcG9ydHMpLmZvckVhY2goayA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2QgPSBpbXBvcnRzW2tdO1xuICAgICAgICAgICAgY29uc3QgbmV3TW9kdWxlID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhtb2QpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0VmFsdWUgPSBtb2RbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSB0aGlzLndyYXBJbXBvcnRGdW5jdGlvbihpbXBvcnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdNb2R1bGVbbmFtZV0gPSBpbXBvcnRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGltcG9ydE9iamVjdFtrXSA9IG5ld01vZHVsZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbXBvcnRPYmplY3Q7XG4gICAgfVxuICAgIHdyYXBFeHBvcnRGdW5jdGlvbihmKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIGxldCByZXQgPSBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB3aGlsZSAoX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9nZXRfc3RhdGUoKSA9PT0gMSAvKiBBc3luY2lmeVN0YXRlLlVOV0lORElORyAqLykge1xuICAgICAgICAgICAgICAgIF90aGlzLmV4cG9ydHMuYXN5bmNpZnlfc3RvcF91bndpbmQoKTtcbiAgICAgICAgICAgICAgICBfdGhpcy52YWx1ZSA9IGF3YWl0IF90aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIF90aGlzLmFzc2VydFN0YXRlKCk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZXhwb3J0cy5hc3luY2lmeV9zdGFydF9yZXdpbmQoX3RoaXMuZGF0YVB0cik7XG4gICAgICAgICAgICAgICAgcmV0ID0gZi5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3RoaXMuYXNzZXJ0U3RhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3cmFwRXhwb3J0cyhleHBvcnRzLCBuZWVkV3JhcCkge1xuICAgICAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGxldCBpZ25vcmUgPSBpZ25vcmVOYW1lcy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0eXBlb2YgZXhwb3J0VmFsdWUgIT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZWVkV3JhcCkpIHtcbiAgICAgICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpZ25vcmUgPyBleHBvcnRWYWx1ZSA6IHRoaXMud3JhcEV4cG9ydEZ1bmN0aW9uKGV4cG9ydFZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cykge1xuICAgIGlmIChpbXBvcnRzICYmIHR5cGVvZiBpbXBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbXBvcnRzIG11c3QgYmUgYW4gb2JqZWN0IG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGZldGNoV2FzbSh1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIGlmICh0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHVybE9yQnVmZmVyLCBpbXBvcnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybE9yQnVmZmVyKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKVxuICAgICAgICAudGhlbihidWZmZXIgPT4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ1ZmZlciwgaW1wb3J0cykpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWQod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgc291cmNlO1xuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCBBcnJheUJ1ZmZlci5pc1ZpZXcod2FzbUlucHV0KSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIGlmICh3YXNtSW5wdXQgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiBfV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUod2FzbUlucHV0LCBpbXBvcnRzKS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgaW5zdGFuY2UsIG1vZHVsZTogd2FzbUlucHV0IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdhc21JbnB1dCAhPT0gJ3N0cmluZycgJiYgISh3YXNtSW5wdXQgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc291cmNlJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxldCByZXNwb25zZVByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UgPSBmZXRjaCh3YXNtSW5wdXQpO1xuICAgICAgICAgICAgc291cmNlID0gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKHJlc3BvbnNlUHJvbWlzZSwgaW1wb3J0cykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICBzb3VyY2UgPSBmZXRjaFdhc20od2FzbUlucHV0LCBpbXBvcnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgc291cmNlID0gZmV0Y2hXYXNtKHdhc21JbnB1dCwgaW1wb3J0cyk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gYXN5bmNpZnlMb2FkKGFzeW5jaWZ5LCB1cmxPckJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgY29uc3QgYXN5bmNpZnlIZWxwZXIgPSBuZXcgQXN5bmNpZnkoKTtcbiAgICBpbXBvcnRzID0gYXN5bmNpZnlIZWxwZXIud3JhcEltcG9ydHMoaW1wb3J0cyk7XG4gICAgcmV0dXJuIGxvYWQodXJsT3JCdWZmZXIsIGltcG9ydHMpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBtZW1vcnkgPSBzb3VyY2UuaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkgfHwgKChfYSA9IGltcG9ydHMuZW52KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWVtb3J5KTtcbiAgICAgICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG4gICAgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgdmFsaWRhdGVJbXBvcnRzKGltcG9ydHMpO1xuICAgIGltcG9ydHMgPSBpbXBvcnRzICE9PSBudWxsICYmIGltcG9ydHMgIT09IHZvaWQgMCA/IGltcG9ydHMgOiB7fTtcbiAgICBsZXQgbW9kdWxlO1xuICAgIGlmICgod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8IEFycmF5QnVmZmVyLmlzVmlldyh3YXNtSW5wdXQpKSB7XG4gICAgICAgIG1vZHVsZSA9IG5ldyBfV2ViQXNzZW1ibHkuTW9kdWxlKHdhc21JbnB1dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdhc21JbnB1dCBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICBtb2R1bGUgPSB3YXNtSW5wdXQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHNvdXJjZScpO1xuICAgIH1cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBfV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLCBpbXBvcnRzKTtcbiAgICBjb25zdCBzb3VyY2UgPSB7IGluc3RhbmNlLCBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGFzeW5jaWZ5TG9hZFN5bmMoYXN5bmNpZnksIGJ1ZmZlciwgaW1wb3J0cykge1xuICAgIHZhciBfYTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIGNvbnN0IGFzeW5jaWZ5SGVscGVyID0gbmV3IEFzeW5jaWZ5KCk7XG4gICAgaW1wb3J0cyA9IGFzeW5jaWZ5SGVscGVyLndyYXBJbXBvcnRzKGltcG9ydHMpO1xuICAgIGNvbnN0IHNvdXJjZSA9IGxvYWRTeW5jKGJ1ZmZlciwgaW1wb3J0cyk7XG4gICAgY29uc3QgbWVtb3J5ID0gc291cmNlLmluc3RhbmNlLmV4cG9ydHMubWVtb3J5IHx8ICgoX2EgPSBpbXBvcnRzLmVudikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1lbW9yeSk7XG4gICAgcmV0dXJuIHsgbW9kdWxlOiBzb3VyY2UubW9kdWxlLCBpbnN0YW5jZTogYXN5bmNpZnlIZWxwZXIuaW5pdChtZW1vcnksIHNvdXJjZS5pbnN0YW5jZSwgYXN5bmNpZnkpIH07XG59XG5cbmNvbnN0IENIQVJfRE9UID0gNDY7IC8qIC4gKi9cbmNvbnN0IENIQVJfRk9SV0FSRF9TTEFTSCA9IDQ3OyAvKiAvICovXG5mdW5jdGlvbiBpc1Bvc2l4UGF0aFNlcGFyYXRvcihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZyhwYXRoLCBhbGxvd0Fib3ZlUm9vdCwgc2VwYXJhdG9yLCBpc1BhdGhTZXBhcmF0b3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgbGV0IGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICBsZXQgbGFzdFNsYXNoID0gLTE7XG4gICAgbGV0IGRvdHMgPSAwO1xuICAgIGxldCBjb2RlID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBwYXRoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChpIDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUgPSBDSEFSX0ZPUldBUkRfU0xBU0g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgICAgICAgaWYgKGxhc3RTbGFzaCA9PT0gaSAtIDEgfHwgZG90cyA9PT0gMSkgO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG90cyA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoIDwgMiB8fCBsYXN0U2VnbWVudExlbmd0aCAhPT0gMiB8fFxuICAgICAgICAgICAgICAgICAgICByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMSkgIT09IENIQVJfRE9UIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAyKSAhPT0gQ0hBUl9ET1QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlcy5pbmRleE9mKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5sZW5ndGggLSAxIC0gcmVzLmluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSByZXMubGVuZ3RoID4gMCA/IGAke3NlcGFyYXRvcn0uLmAgOiAnLi4nO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBgJHtzZXBhcmF0b3J9JHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGkgLSBsYXN0U2xhc2ggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IENIQVJfRE9UICYmIGRvdHMgIT09IC0xKSB7XG4gICAgICAgICAgICArK2RvdHM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb3RzID0gLTE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIHJlc29sdmUoLi4uYXJncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSAnJztcbiAgICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgICAgICBjb25zdCBwYXRoID0gaSA+PSAwID8gYXJnc1tpXSA6ICcvJztcbiAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTtcbiAgICAgICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDtcbiAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIO1xuICAgIH1cbiAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkUGF0aCwgIXJlc29sdmVkQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpO1xuICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7XG4gICAgICAgIHJldHVybiBgLyR7cmVzb2x2ZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiByZXNvbHZlZFBhdGgubGVuZ3RoID4gMCA/IHJlc29sdmVkUGF0aCA6ICcuJztcbn1cblxuY29uc3QgRkRfREFUQVNZTkMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMCkpO1xuY29uc3QgRkRfUkVBRCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxKSk7XG5jb25zdCBGRF9TRUVLID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIpKTtcbmNvbnN0IEZEX0ZEU1RBVF9TRVRfRkxBR1MgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMykpO1xuY29uc3QgRkRfU1lOQyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg0KSk7XG5jb25zdCBGRF9URUxMID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDUpKTtcbmNvbnN0IEZEX1dSSVRFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDYpKTtcbmNvbnN0IEZEX0FEVklTRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg3KSk7XG5jb25zdCBGRF9BTExPQ0FURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCg4KSk7XG5jb25zdCBQQVRIX0NSRUFURV9ESVJFQ1RPUlkgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoOSkpO1xuY29uc3QgUEFUSF9DUkVBVEVfRklMRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMCkpO1xuY29uc3QgUEFUSF9MSU5LX1NPVVJDRSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMSkpO1xuY29uc3QgUEFUSF9MSU5LX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxMikpO1xuY29uc3QgUEFUSF9PUEVOID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDEzKSk7XG5jb25zdCBGRF9SRUFERElSID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE0KSk7XG5jb25zdCBQQVRIX1JFQURMSU5LID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDE1KSk7XG5jb25zdCBQQVRIX1JFTkFNRV9TT1VSQ0UgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTYpKTtcbmNvbnN0IFBBVEhfUkVOQU1FX1RBUkdFVCA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgxNykpO1xuY29uc3QgUEFUSF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTgpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1NJWkUgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMTkpKTtcbmNvbnN0IFBBVEhfRklMRVNUQVRfU0VUX1RJTUVTID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIwKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9HRVQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjEpKTtcbmNvbnN0IEZEX0ZJTEVTVEFUX1NFVF9TSVpFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDIyKSk7XG5jb25zdCBGRF9GSUxFU1RBVF9TRVRfVElNRVMgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjMpKTtcbmNvbnN0IFBBVEhfU1lNTElOSyA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNCkpO1xuY29uc3QgUEFUSF9SRU1PVkVfRElSRUNUT1JZID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI1KSk7XG5jb25zdCBQQVRIX1VOTElOS19GSUxFID0gKCAvKiNfX1BVUkVfXyovQmlnSW50KDEpIDw8IC8qI19fUFVSRV9fKi8gQmlnSW50KDI2KSk7XG5jb25zdCBQT0xMX0ZEX1JFQURXUklURSA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyNykpO1xuY29uc3QgU09DS19TSFVURE9XTiA9ICggLyojX19QVVJFX18qL0JpZ0ludCgxKSA8PCAvKiNfX1BVUkVfXyovIEJpZ0ludCgyOCkpO1xuY29uc3QgU09DS19BQ0NFUFQgPSAoIC8qI19fUFVSRV9fKi9CaWdJbnQoMSkgPDwgLyojX19QVVJFX18qLyBCaWdJbnQoMjkpKTtcbmNvbnN0IFdhc2lSaWdodHMgPSB7XG4gICAgRkRfREFUQVNZTkMsXG4gICAgRkRfUkVBRCxcbiAgICBGRF9TRUVLLFxuICAgIEZEX0ZEU1RBVF9TRVRfRkxBR1MsXG4gICAgRkRfU1lOQyxcbiAgICBGRF9URUxMLFxuICAgIEZEX1dSSVRFLFxuICAgIEZEX0FEVklTRSxcbiAgICBGRF9BTExPQ0FURSxcbiAgICBQQVRIX0NSRUFURV9ESVJFQ1RPUlksXG4gICAgUEFUSF9DUkVBVEVfRklMRSxcbiAgICBQQVRIX0xJTktfU09VUkNFLFxuICAgIFBBVEhfTElOS19UQVJHRVQsXG4gICAgUEFUSF9PUEVOLFxuICAgIEZEX1JFQURESVIsXG4gICAgUEFUSF9SRUFETElOSyxcbiAgICBQQVRIX1JFTkFNRV9TT1VSQ0UsXG4gICAgUEFUSF9SRU5BTUVfVEFSR0VULFxuICAgIFBBVEhfRklMRVNUQVRfR0VULFxuICAgIFBBVEhfRklMRVNUQVRfU0VUX1NJWkUsXG4gICAgUEFUSF9GSUxFU1RBVF9TRVRfVElNRVMsXG4gICAgRkRfRklMRVNUQVRfR0VULFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9TSVpFLFxuICAgIEZEX0ZJTEVTVEFUX1NFVF9USU1FUyxcbiAgICBQQVRIX1NZTUxJTkssXG4gICAgUEFUSF9SRU1PVkVfRElSRUNUT1JZLFxuICAgIFBBVEhfVU5MSU5LX0ZJTEUsXG4gICAgUE9MTF9GRF9SRUFEV1JJVEUsXG4gICAgU09DS19TSFVURE9XTixcbiAgICBTT0NLX0FDQ0VQVFxufTtcblxuZnVuY3Rpb24gc3RyZXJyb3IoZXJybm8pIHtcbiAgICBzd2l0Y2ggKGVycm5vKSB7XG4gICAgICAgIGNhc2UgMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi86IHJldHVybiAnU3VjY2Vzcyc7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRXJybm8uRTJCSUcgKi86IHJldHVybiAnQXJndW1lbnQgbGlzdCB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMiAvKiBXYXNpRXJybm8uRUFDQ0VTICovOiByZXR1cm4gJ1Blcm1pc3Npb24gZGVuaWVkJztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lFcnJuby5FQUREUklOVVNFICovOiByZXR1cm4gJ0FkZHJlc3MgaW4gdXNlJztcbiAgICAgICAgY2FzZSA0IC8qIFdhc2lFcnJuby5FQUREUk5PVEFWQUlMICovOiByZXR1cm4gJ0FkZHJlc3Mgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRXJybm8uRUFGTk9TVVBQT1JUICovOiByZXR1cm4gJ0FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wnO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUVycm5vLkVBR0FJTiAqLzogcmV0dXJuICdSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNyAvKiBXYXNpRXJybm8uRUFMUkVBRFkgKi86IHJldHVybiAnT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDggLyogV2FzaUVycm5vLkVCQURGICovOiByZXR1cm4gJ0JhZCBmaWxlIGRlc2NyaXB0b3InO1xuICAgICAgICBjYXNlIDkgLyogV2FzaUVycm5vLkVCQURNU0cgKi86IHJldHVybiAnQmFkIG1lc3NhZ2UnO1xuICAgICAgICBjYXNlIDEwIC8qIFdhc2lFcnJuby5FQlVTWSAqLzogcmV0dXJuICdSZXNvdXJjZSBidXN5JztcbiAgICAgICAgY2FzZSAxMSAvKiBXYXNpRXJybm8uRUNBTkNFTEVEICovOiByZXR1cm4gJ09wZXJhdGlvbiBjYW5jZWxlZCc7XG4gICAgICAgIGNhc2UgMTIgLyogV2FzaUVycm5vLkVDSElMRCAqLzogcmV0dXJuICdObyBjaGlsZCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSAxMyAvKiBXYXNpRXJybm8uRUNPTk5BQk9SVEVEICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gYWJvcnRlZCc7XG4gICAgICAgIGNhc2UgMTQgLyogV2FzaUVycm5vLkVDT05OUkVGVVNFRCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlZnVzZWQnO1xuICAgICAgICBjYXNlIDE1IC8qIFdhc2lFcnJuby5FQ09OTlJFU0VUICovOiByZXR1cm4gJ0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcic7XG4gICAgICAgIGNhc2UgMTYgLyogV2FzaUVycm5vLkVERUFETEsgKi86IHJldHVybiAnUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXInO1xuICAgICAgICBjYXNlIDE3IC8qIFdhc2lFcnJuby5FREVTVEFERFJSRVEgKi86IHJldHVybiAnRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCc7XG4gICAgICAgIGNhc2UgMTggLyogV2FzaUVycm5vLkVET00gKi86IHJldHVybiAnRG9tYWluIGVycm9yJztcbiAgICAgICAgY2FzZSAxOSAvKiBXYXNpRXJybm8uRURRVU9UICovOiByZXR1cm4gJ1F1b3RhIGV4Y2VlZGVkJztcbiAgICAgICAgY2FzZSAyMCAvKiBXYXNpRXJybm8uRUVYSVNUICovOiByZXR1cm4gJ0ZpbGUgZXhpc3RzJztcbiAgICAgICAgY2FzZSAyMSAvKiBXYXNpRXJybm8uRUZBVUxUICovOiByZXR1cm4gJ0JhZCBhZGRyZXNzJztcbiAgICAgICAgY2FzZSAyMiAvKiBXYXNpRXJybm8uRUZCSUcgKi86IHJldHVybiAnRmlsZSB0b28gbGFyZ2UnO1xuICAgICAgICBjYXNlIDIzIC8qIFdhc2lFcnJuby5FSE9TVFVOUkVBQ0ggKi86IHJldHVybiAnSG9zdCBpcyB1bnJlYWNoYWJsZSc7XG4gICAgICAgIGNhc2UgMjQgLyogV2FzaUVycm5vLkVJRFJNICovOiByZXR1cm4gJ0lkZW50aWZpZXIgcmVtb3ZlZCc7XG4gICAgICAgIGNhc2UgMjUgLyogV2FzaUVycm5vLkVJTFNFUSAqLzogcmV0dXJuICdJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UnO1xuICAgICAgICBjYXNlIDI2IC8qIFdhc2lFcnJuby5FSU5QUk9HUkVTUyAqLzogcmV0dXJuICdPcGVyYXRpb24gaW4gcHJvZ3Jlc3MnO1xuICAgICAgICBjYXNlIDI3IC8qIFdhc2lFcnJuby5FSU5UUiAqLzogcmV0dXJuICdJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCc7XG4gICAgICAgIGNhc2UgMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLzogcmV0dXJuICdJbnZhbGlkIGFyZ3VtZW50JztcbiAgICAgICAgY2FzZSAyOSAvKiBXYXNpRXJybm8uRUlPICovOiByZXR1cm4gJ0kvTyBlcnJvcic7XG4gICAgICAgIGNhc2UgMzAgLyogV2FzaUVycm5vLkVJU0NPTk4gKi86IHJldHVybiAnU29ja2V0IGlzIGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgMzEgLyogV2FzaUVycm5vLkVJU0RJUiAqLzogcmV0dXJuICdJcyBhIGRpcmVjdG9yeSc7XG4gICAgICAgIGNhc2UgMzIgLyogV2FzaUVycm5vLkVMT09QICovOiByZXR1cm4gJ1N5bWJvbGljIGxpbmsgbG9vcCc7XG4gICAgICAgIGNhc2UgMzMgLyogV2FzaUVycm5vLkVNRklMRSAqLzogcmV0dXJuICdObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgMzQgLyogV2FzaUVycm5vLkVNTElOSyAqLzogcmV0dXJuICdUb28gbWFueSBsaW5rcyc7XG4gICAgICAgIGNhc2UgMzUgLyogV2FzaUVycm5vLkVNU0dTSVpFICovOiByZXR1cm4gJ01lc3NhZ2UgdG9vIGxhcmdlJztcbiAgICAgICAgY2FzZSAzNiAvKiBXYXNpRXJybm8uRU1VTFRJSE9QICovOiByZXR1cm4gJ011bHRpaG9wIGF0dGVtcHRlZCc7XG4gICAgICAgIGNhc2UgMzcgLyogV2FzaUVycm5vLkVOQU1FVE9PTE9ORyAqLzogcmV0dXJuICdGaWxlbmFtZSB0b28gbG9uZyc7XG4gICAgICAgIGNhc2UgMzggLyogV2FzaUVycm5vLkVORVRET1dOICovOiByZXR1cm4gJ05ldHdvcmsgaXMgZG93bic7XG4gICAgICAgIGNhc2UgMzkgLyogV2FzaUVycm5vLkVORVRSRVNFVCAqLzogcmV0dXJuICdDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsnO1xuICAgICAgICBjYXNlIDQwIC8qIFdhc2lFcnJuby5FTkVUVU5SRUFDSCAqLzogcmV0dXJuICdOZXR3b3JrIHVucmVhY2hhYmxlJztcbiAgICAgICAgY2FzZSA0MSAvKiBXYXNpRXJybm8uRU5GSUxFICovOiByZXR1cm4gJ1RvbyBtYW55IGZpbGVzIG9wZW4gaW4gc3lzdGVtJztcbiAgICAgICAgY2FzZSA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLzogcmV0dXJuICdObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlJztcbiAgICAgICAgY2FzZSA0MyAvKiBXYXNpRXJybm8uRU5PREVWICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlJztcbiAgICAgICAgY2FzZSA0NCAvKiBXYXNpRXJybm8uRU5PRU5UICovOiByZXR1cm4gJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknO1xuICAgICAgICBjYXNlIDQ1IC8qIFdhc2lFcnJuby5FTk9FWEVDICovOiByZXR1cm4gJ0V4ZWMgZm9ybWF0IGVycm9yJztcbiAgICAgICAgY2FzZSA0NiAvKiBXYXNpRXJybm8uRU5PTENLICovOiByZXR1cm4gJ05vIGxvY2tzIGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNDcgLyogV2FzaUVycm5vLkVOT0xJTksgKi86IHJldHVybiAnTGluayBoYXMgYmVlbiBzZXZlcmVkJztcbiAgICAgICAgY2FzZSA0OCAvKiBXYXNpRXJybm8uRU5PTUVNICovOiByZXR1cm4gJ091dCBvZiBtZW1vcnknO1xuICAgICAgICBjYXNlIDQ5IC8qIFdhc2lFcnJuby5FTk9NU0cgKi86IHJldHVybiAnTm8gbWVzc2FnZSBvZiB0aGUgZGVzaXJlZCB0eXBlJztcbiAgICAgICAgY2FzZSA1MCAvKiBXYXNpRXJybm8uRU5PUFJPVE9PUFQgKi86IHJldHVybiAnUHJvdG9jb2wgbm90IGF2YWlsYWJsZSc7XG4gICAgICAgIGNhc2UgNTEgLyogV2FzaUVycm5vLkVOT1NQQyAqLzogcmV0dXJuICdObyBzcGFjZSBsZWZ0IG9uIGRldmljZSc7XG4gICAgICAgIGNhc2UgNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLzogcmV0dXJuICdGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQnO1xuICAgICAgICBjYXNlIDUzIC8qIFdhc2lFcnJuby5FTk9UQ09OTiAqLzogcmV0dXJuICdTb2NrZXQgbm90IGNvbm5lY3RlZCc7XG4gICAgICAgIGNhc2UgNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi86IHJldHVybiAnTm90IGEgZGlyZWN0b3J5JztcbiAgICAgICAgY2FzZSA1NSAvKiBXYXNpRXJybm8uRU5PVEVNUFRZICovOiByZXR1cm4gJ0RpcmVjdG9yeSBub3QgZW1wdHknO1xuICAgICAgICBjYXNlIDU2IC8qIFdhc2lFcnJuby5FTk9UUkVDT1ZFUkFCTEUgKi86IHJldHVybiAnU3RhdGUgbm90IHJlY292ZXJhYmxlJztcbiAgICAgICAgY2FzZSA1NyAvKiBXYXNpRXJybm8uRU5PVFNPQ0sgKi86IHJldHVybiAnTm90IGEgc29ja2V0JztcbiAgICAgICAgY2FzZSA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLzogcmV0dXJuICdOb3Qgc3VwcG9ydGVkJztcbiAgICAgICAgY2FzZSA1OSAvKiBXYXNpRXJybm8uRU5PVFRZICovOiByZXR1cm4gJ05vdCBhIHR0eSc7XG4gICAgICAgIGNhc2UgNjAgLyogV2FzaUVycm5vLkVOWElPICovOiByZXR1cm4gJ05vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MnO1xuICAgICAgICBjYXNlIDYxIC8qIFdhc2lFcnJuby5FT1ZFUkZMT1cgKi86IHJldHVybiAnVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUnO1xuICAgICAgICBjYXNlIDYyIC8qIFdhc2lFcnJuby5FT1dORVJERUFEICovOiByZXR1cm4gJ1ByZXZpb3VzIG93bmVyIGRpZWQnO1xuICAgICAgICBjYXNlIDYzIC8qIFdhc2lFcnJuby5FUEVSTSAqLzogcmV0dXJuICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCc7XG4gICAgICAgIGNhc2UgNjQgLyogV2FzaUVycm5vLkVQSVBFICovOiByZXR1cm4gJ0Jyb2tlbiBwaXBlJztcbiAgICAgICAgY2FzZSA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovOiByZXR1cm4gJ1Byb3RvY29sIGVycm9yJztcbiAgICAgICAgY2FzZSA2NiAvKiBXYXNpRXJybm8uRVBST1RPTk9TVVBQT1JUICovOiByZXR1cm4gJ1Byb3RvY29sIG5vdCBzdXBwb3J0ZWQnO1xuICAgICAgICBjYXNlIDY3IC8qIFdhc2lFcnJuby5FUFJPVE9UWVBFICovOiByZXR1cm4gJ1Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCc7XG4gICAgICAgIGNhc2UgNjggLyogV2FzaUVycm5vLkVSQU5HRSAqLzogcmV0dXJuICdSZXN1bHQgbm90IHJlcHJlc2VudGFibGUnO1xuICAgICAgICBjYXNlIDY5IC8qIFdhc2lFcnJuby5FUk9GUyAqLzogcmV0dXJuICdSZWFkLW9ubHkgZmlsZSBzeXN0ZW0nO1xuICAgICAgICBjYXNlIDcwIC8qIFdhc2lFcnJuby5FU1BJUEUgKi86IHJldHVybiAnSW52YWxpZCBzZWVrJztcbiAgICAgICAgY2FzZSA3MSAvKiBXYXNpRXJybm8uRVNSQ0ggKi86IHJldHVybiAnTm8gc3VjaCBwcm9jZXNzJztcbiAgICAgICAgY2FzZSA3MiAvKiBXYXNpRXJybm8uRVNUQUxFICovOiByZXR1cm4gJ1N0YWxlIGZpbGUgaGFuZGxlJztcbiAgICAgICAgY2FzZSA3MyAvKiBXYXNpRXJybm8uRVRJTUVET1VUICovOiByZXR1cm4gJ09wZXJhdGlvbiB0aW1lZCBvdXQnO1xuICAgICAgICBjYXNlIDc0IC8qIFdhc2lFcnJuby5FVFhUQlNZICovOiByZXR1cm4gJ1RleHQgZmlsZSBidXN5JztcbiAgICAgICAgY2FzZSA3NSAvKiBXYXNpRXJybm8uRVhERVYgKi86IHJldHVybiAnQ3Jvc3MtZGV2aWNlIGxpbmsnO1xuICAgICAgICBjYXNlIDc2IC8qIFdhc2lFcnJuby5FTk9UQ0FQQUJMRSAqLzogcmV0dXJuICdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JztcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICdVbmtub3duIGVycm9yJztcbiAgICB9XG59XG5jbGFzcyBXYXNpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgZXJybm8pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXJybm8gPSBlcnJubztcbiAgICB9XG4gICAgZ2V0RXJyb3JNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gc3RyZXJyb3IodGhpcy5lcnJubyk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdhc2lFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ1dhc2lFcnJvcidcbn0pO1xuXG5jb25zdCBSSUdIVFNfQUxMID0gV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NFRUsgfFxuICAgIFdhc2lSaWdodHMuRkRfRkRTVEFUX1NFVF9GTEFHUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TWU5DIHxcbiAgICBXYXNpUmlnaHRzLkZEX1RFTEwgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOIHxcbiAgICBXYXNpUmlnaHRzLlNPQ0tfQUNDRVBUO1xuY29uc3QgQkxPQ0tfREVWSUNFX0JBU0UgPSBSSUdIVFNfQUxMO1xuY29uc3QgQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkcgPSBSSUdIVFNfQUxMO1xuY29uc3QgQ0hBUkFDVEVSX0RFVklDRV9CQVNFID0gUklHSFRTX0FMTDtcbmNvbnN0IENIQVJBQ1RFUl9ERVZJQ0VfSU5IRVJJVElORyA9IFJJR0hUU19BTEw7XG5jb25zdCBSRUdVTEFSX0ZJTEVfQkFTRSA9IFdhc2lSaWdodHMuRkRfREFUQVNZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9TRUVLIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfU1lOQyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9URUxMIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0FEVklTRSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmNvbnN0IERJUkVDVE9SWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1NZTkMgfFxuICAgIFdhc2lSaWdodHMuRkRfQURWSVNFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0NSRUFURV9GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9MSU5LX1RBUkdFVCB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX09QRU4gfFxuICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUiB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9TRVRfU0laRSB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUyB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSyB8XG4gICAgV2FzaVJpZ2h0cy5QQVRIX1VOTElOS19GSUxFIHxcbiAgICBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURTtcbmNvbnN0IERJUkVDVE9SWV9JTkhFUklUSU5HID0gRElSRUNUT1JZX0JBU0UgfCBSRUdVTEFSX0ZJTEVfQkFTRTtcbmNvbnN0IFNPQ0tFVF9CQVNFID0gKFdhc2lSaWdodHMuRkRfUkVBRCB8XG4gICAgV2FzaVJpZ2h0cy5GRF9GRFNUQVRfU0VUX0ZMQUdTIHxcbiAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX0dFVCB8XG4gICAgV2FzaVJpZ2h0cy5QT0xMX0ZEX1JFQURXUklURSB8XG4gICAgV2FzaVJpZ2h0cy5TT0NLX1NIVVRET1dOKTtcbmNvbnN0IFNPQ0tFVF9JTkhFUklUSU5HID0gUklHSFRTX0FMTDtcbmNvbnN0IFRUWV9CQVNFID0gV2FzaVJpZ2h0cy5GRF9SRUFEIHxcbiAgICBXYXNpUmlnaHRzLkZEX0ZEU1RBVF9TRVRfRkxBR1MgfFxuICAgIFdhc2lSaWdodHMuRkRfV1JJVEUgfFxuICAgIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfR0VUIHxcbiAgICBXYXNpUmlnaHRzLlBPTExfRkRfUkVBRFdSSVRFO1xuY29uc3QgVFRZX0lOSEVSSVRJTkcgPSAvKiNfX1BVUkVfXyovIEJpZ0ludCgwKTtcbmZ1bmN0aW9uIGdldFJpZ2h0cyhzdGRpbywgZmQsIGZsYWdzLCB0eXBlKSB7XG4gICAgY29uc3QgcmV0ID0ge1xuICAgICAgICBiYXNlOiBCaWdJbnQoMCksXG4gICAgICAgIGluaGVyaXRpbmc6IEJpZ0ludCgwKVxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09IDAgLyogV2FzaUZpbGVUeXBlLlVOS05PV04gKi8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biBmaWxlIHR5cGUnLCAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovKTtcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBSRUdVTEFSX0ZJTEVfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gUkVHVUxBUl9GSUxFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi86XG4gICAgICAgICAgICByZXQuYmFzZSA9IERJUkVDVE9SWV9CQVNFO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBESVJFQ1RPUllfSU5IRVJJVElORztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDYgLyogV2FzaUZpbGVUeXBlLlNPQ0tFVF9TVFJFQU0gKi86XG4gICAgICAgIGNhc2UgNSAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX0RHUkFNICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBTT0NLRVRfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gU09DS0VUX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovOlxuICAgICAgICAgICAgaWYgKHN0ZGlvLmluZGV4T2YoZmQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gVFRZX0JBU0U7XG4gICAgICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBUVFlfSU5IRVJJVElORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldC5iYXNlID0gQ0hBUkFDVEVSX0RFVklDRV9CQVNFO1xuICAgICAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQ0hBUkFDVEVSX0RFVklDRV9JTkhFUklUSU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMSAvKiBXYXNpRmlsZVR5cGUuQkxPQ0tfREVWSUNFICovOlxuICAgICAgICAgICAgcmV0LmJhc2UgPSBCTE9DS19ERVZJQ0VfQkFTRTtcbiAgICAgICAgICAgIHJldC5pbmhlcml0aW5nID0gQkxPQ0tfREVWSUNFX0lOSEVSSVRJTkc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldC5iYXNlID0gQmlnSW50KDApO1xuICAgICAgICAgICAgcmV0LmluaGVyaXRpbmcgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIC8qIERpc2FibGUgcmVhZC93cml0ZSBiaXRzIGRlcGVuZGluZyBvbiBhY2Nlc3MgbW9kZS4gKi9cbiAgICBjb25zdCByZWFkX29yX3dyaXRlX29ubHkgPSBmbGFncyAmICgwIHwgMSB8IDIpO1xuICAgIGlmIChyZWFkX29yX3dyaXRlX29ubHkgPT09IDApIHtcbiAgICAgICAgcmV0LmJhc2UgJj0gfldhc2lSaWdodHMuRkRfV1JJVEU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlYWRfb3Jfd3JpdGVfb25seSA9PT0gMSkge1xuICAgICAgICByZXQuYmFzZSAmPSB+V2FzaVJpZ2h0cy5GRF9SRUFEO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjb25jYXRCdWZmZXIoYnVmZmVycywgc2l6ZSkge1xuICAgIGxldCB0b3RhbCA9IDA7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJyAmJiBzaXplID49IDApIHtcbiAgICAgICAgdG90YWwgPSBzaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBidWZmZXJzW2ldO1xuICAgICAgICAgICAgdG90YWwgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcG9zID0gMDtcbiAgICBjb25zdCByZXQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlcnNbaV07XG4gICAgICAgIHJldC5zZXQoYnVmZmVyLCBwb3MpO1xuICAgICAgICBwb3MgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5mZCA9IGZkO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLnJlYWxQYXRoID0gcmVhbFBhdGg7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMucmlnaHRzQmFzZSA9IHJpZ2h0c0Jhc2U7XG4gICAgICAgIHRoaXMucmlnaHRzSW5oZXJpdGluZyA9IHJpZ2h0c0luaGVyaXRpbmc7XG4gICAgICAgIHRoaXMucHJlb3BlbiA9IHByZW9wZW47XG4gICAgICAgIHRoaXMucG9zID0gQmlnSW50KDApO1xuICAgICAgICB0aGlzLnNpemUgPSBCaWdJbnQoMCk7XG4gICAgfVxuICAgIHNlZWsob2Zmc2V0LCB3aGVuY2UpIHtcbiAgICAgICAgaWYgKHdoZW5jZSA9PT0gMCAvKiBXYXNpV2hlbmNlLlNFVCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aGVuY2UgPT09IDEgLyogV2FzaVdoZW5jZS5DVVIgKi8pIHtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdoZW5jZSA9PT0gMiAvKiBXYXNpV2hlbmNlLkVORCAqLykge1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBCaWdJbnQodGhpcy5zaXplKSAtIEJpZ0ludChvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignVW5rbm93biB3aGVuY2UnLCAyOSAvKiBXYXNpRXJybm8uRUlPICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3M7XG4gICAgfVxufVxuY2xhc3MgU3RhbmRhcmRPdXRwdXQgZXh0ZW5kcyBGaWxlRGVzY3JpcHRvciB7XG4gICAgY29uc3RydWN0b3IobG9nLCBpZCwgZmQsIHBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHN1cGVyKGlkLCBmZCwgcGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB0aGlzLl9sb2cgPSBsb2c7XG4gICAgICAgIHRoaXMuX2J1ZiA9IG51bGw7XG4gICAgfVxuICAgIHdyaXRlKGJ1ZmZlcikge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgaWYgKHRoaXMuX2J1Zikge1xuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0QnVmZmVyKFt0aGlzLl9idWYsIGJ1ZmZlcl0pO1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVmZmVyLmluZGV4T2YoMTApID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fYnVmID0gYnVmZmVyO1xuICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdyaXR0ZW4gPSAwO1xuICAgICAgICBsZXQgbGFzdEJlZ2luID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICB3aGlsZSAoKGluZGV4ID0gYnVmZmVyLmluZGV4T2YoMTAsIHdyaXR0ZW4pKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShidWZmZXIuc3ViYXJyYXkobGFzdEJlZ2luLCBpbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5fbG9nKHN0cik7XG4gICAgICAgICAgICB3cml0dGVuICs9IGluZGV4IC0gbGFzdEJlZ2luICsgMTtcbiAgICAgICAgICAgIGxhc3RCZWdpbiA9IGluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JpdHRlbiA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZiA9IGJ1ZmZlci5zbGljZSh3cml0dGVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICB9XG59XG5mdW5jdGlvbiB0b0ZpbGVUeXBlKHN0YXQpIHtcbiAgICBpZiAoc3RhdC5pc0Jsb2NrRGV2aWNlKCkpXG4gICAgICAgIHJldHVybiAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSlcbiAgICAgICAgcmV0dXJuIDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgcmV0dXJuIDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICBpZiAoc3RhdC5pc1NvY2tldCgpKVxuICAgICAgICByZXR1cm4gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICBpZiAoc3RhdC5pc0ZpbGUoKSlcbiAgICAgICAgcmV0dXJuIDQgLyogV2FzaUZpbGVUeXBlLlJFR1VMQVJfRklMRSAqLztcbiAgICBpZiAoc3RhdC5pc1N5bWJvbGljTGluaygpKVxuICAgICAgICByZXR1cm4gNyAvKiBXYXNpRmlsZVR5cGUuU1lNQk9MSUNfTElOSyAqLztcbiAgICByZXR1cm4gMCAvKiBXYXNpRmlsZVR5cGUuVU5LTk9XTiAqLztcbn1cbmZ1bmN0aW9uIHRvRmlsZVN0YXQodmlldywgYnVmLCBzdGF0KSB7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmLCBzdGF0LmRldiwgdHJ1ZSk7XG4gICAgdmlldy5zZXRCaWdVaW50NjQoYnVmICsgOCwgc3RhdC5pbm8sIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDE2LCBCaWdJbnQodG9GaWxlVHlwZShzdGF0KSksIHRydWUpO1xuICAgIHZpZXcuc2V0QmlnVWludDY0KGJ1ZiArIDI0LCBzdGF0Lm5saW5rLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyAzMiwgc3RhdC5zaXplLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0MCwgc3RhdC5hdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA0OCwgc3RhdC5tdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChidWYgKyA1Niwgc3RhdC5jdGltZU1zICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbn1cbmNsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy51c2VkID0gMDtcbiAgICAgICAgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgICB0aGlzLmZkcyA9IEFycmF5KG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgIHRoaXMuc3RkaW8gPSBbb3B0aW9ucy5pbiwgb3B0aW9ucy5vdXQsIG9wdGlvbnMuZXJyXTtcbiAgICAgICAgdGhpcy5wcmludCA9IG9wdGlvbnMucHJpbnQ7XG4gICAgICAgIHRoaXMucHJpbnRFcnIgPSBvcHRpb25zLnByaW50RXJyO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuaW4sIDAsICc8c3RkaW4+Jyk7XG4gICAgICAgIHRoaXMuaW5zZXJ0U3RkaW8ob3B0aW9ucy5vdXQsIDEsICc8c3Rkb3V0PicpO1xuICAgICAgICB0aGlzLmluc2VydFN0ZGlvKG9wdGlvbnMuZXJyLCAyLCAnPHN0ZGVycj4nKTtcbiAgICB9XG4gICAgaW5zZXJ0U3RkaW8oZmQsIGV4cGVjdGVkLCBuYW1lKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAyIC8qIFdhc2lGaWxlVHlwZS5DSEFSQUNURVJfREVWSUNFICovO1xuICAgICAgICBjb25zdCB7IGJhc2UsIGluaGVyaXRpbmcgfSA9IGdldFJpZ2h0cyh0aGlzLnN0ZGlvLCBmZCwgMiAvKiBGaWxlQ29udHJvbEZsYWcuT19SRFdSICovLCB0eXBlKTtcbiAgICAgICAgY29uc3Qgd3JhcCA9IHRoaXMuaW5zZXJ0KGZkLCBuYW1lLCBuYW1lLCB0eXBlLCBiYXNlLCBpbmhlcml0aW5nLCAwKTtcbiAgICAgICAgaWYgKHdyYXAuaWQgIT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKGBpZDogJHt3cmFwLmlkfSAhPT0gZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YCwgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwO1xuICAgIH1cbiAgICBpbnNlcnQoZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICBpZiAodGhpcy51c2VkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAqIDI7XG4gICAgICAgICAgICB0aGlzLmZkcy5sZW5ndGggPSBuZXdTaXplO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnNpemU7XG4gICAgICAgICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNpemU7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZkc1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBlbnRyeTtcbiAgICAgICAgaWYgKG1hcHBlZFBhdGggPT09ICc8c3Rkb3V0PicpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IFN0YW5kYXJkT3V0cHV0KChfYSA9IHRoaXMucHJpbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnNvbGUubG9nLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXBwZWRQYXRoID09PSAnPHN0ZGVycj4nKSB7XG4gICAgICAgICAgICBlbnRyeSA9IG5ldyBTdGFuZGFyZE91dHB1dCgoX2IgPSB0aGlzLnByaW50RXJyKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjb25zb2xlLmVycm9yLCBpbmRleCwgZmQsIG1hcHBlZFBhdGgsIHJlYWxQYXRoLCB0eXBlLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nLCBwcmVvcGVuKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVudHJ5ID0gbmV3IEZpbGVEZXNjcmlwdG9yKGluZGV4LCBmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgsIHR5cGUsIHJpZ2h0c0Jhc2UsIHJpZ2h0c0luaGVyaXRpbmcsIHByZW9wZW4pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmRzW2luZGV4XSA9IGVudHJ5O1xuICAgICAgICB0aGlzLnVzZWQrKztcbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH1cbiAgICBnZXQoaWQsIGJhc2UsIGluaGVyaXRpbmcpIHtcbiAgICAgICAgaWYgKGlkID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignSW52YWxpZCBmZCcsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZmRzW2lkXTtcbiAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5pZCAhPT0gaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0JhZCBmaWxlIGRlc2NyaXB0b3InLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgZmQgaGFzIHRoZSBuZWNlc3NhcnkgcmlnaHRzLiAqL1xuICAgICAgICBpZiAoKH5lbnRyeS5yaWdodHNCYXNlICYgYmFzZSkgIT09IEJpZ0ludCgwKSB8fCAofmVudHJ5LnJpZ2h0c0luaGVyaXRpbmcgJiBpbmhlcml0aW5nKSAhPT0gQmlnSW50KDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdDYXBhYmlsaXRpZXMgaW5zdWZmaWNpZW50JywgNzYgLyogV2FzaUVycm5vLkVOT1RDQVBBQkxFICovKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIHJlbW92ZShpZCkge1xuICAgICAgICBpZiAoaWQgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5mZHNbaWRdO1xuICAgICAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmlkICE9PSBpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcignQmFkIGZpbGUgZGVzY3JpcHRvcicsIDggLyogV2FzaUVycm5vLkVCQURGICovKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZkc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cbmNsYXNzIFN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZnMgPSBvcHRpb25zLmZzO1xuICAgIH1cbiAgICBnZXRGaWxlVHlwZUJ5RmQoZmQpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmZzLmZzdGF0U3luYyhmZCwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcy5jbG9zZVN5bmMoZHN0RW50cnkuZmQpO1xuICAgICAgICB0aGlzLmZkc1tkc3RdID0gdGhpcy5mZHNbc3JjXTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XS5pZCA9IGRzdDtcbiAgICAgICAgdGhpcy5mZHNbc3JjXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51c2VkLS07XG4gICAgfVxufVxuY2xhc3MgQXN5bmNUYWJsZSBleHRlbmRzIEZpbGVEZXNjcmlwdG9yVGFibGUge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdXNlbGVzcy1jb25zdHJ1Y3RvclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jIGdldEZpbGVUeXBlQnlGZChmZCkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZkLnN0YXQoeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0b0ZpbGVUeXBlKHN0YXRzKTtcbiAgICB9XG4gICAgYXN5bmMgaW5zZXJ0UHJlb3BlbihmZCwgbWFwcGVkUGF0aCwgcmVhbFBhdGgpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGF3YWl0IHRoaXMuZ2V0RmlsZVR5cGVCeUZkKGZkKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdhc2lFcnJvcihgUHJlb3BlbiBub3QgZGlyOiBbXCIke21hcHBlZFBhdGh9XCIsIFwiJHtyZWFsUGF0aH1cIl1gLCA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0UmlnaHRzKHRoaXMuc3RkaW8sIGZkLmZkLCAwLCB0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGZkLCBtYXBwZWRQYXRoLCByZWFsUGF0aCwgdHlwZSwgcmVzdWx0LmJhc2UsIHJlc3VsdC5pbmhlcml0aW5nLCAxKTtcbiAgICB9XG4gICAgYXN5bmMgcmVudW1iZXIoZHN0LCBzcmMpIHtcbiAgICAgICAgaWYgKGRzdCA9PT0gc3JjKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZHN0ID49IHRoaXMuc2l6ZSB8fCBzcmMgPj0gdGhpcy5zaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV2FzaUVycm9yKCdJbnZhbGlkIGZkJywgOCAvKiBXYXNpRXJybm8uRUJBREYgKi8pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRzdEVudHJ5ID0gdGhpcy5mZHNbZHN0XTtcbiAgICAgICAgY29uc3Qgc3JjRW50cnkgPSB0aGlzLmZkc1tzcmNdO1xuICAgICAgICBpZiAoIWRzdEVudHJ5IHx8ICFzcmNFbnRyeSB8fCBkc3RFbnRyeS5pZCAhPT0gZHN0IHx8IHNyY0VudHJ5LmlkICE9PSBzcmMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXYXNpRXJyb3IoJ0ludmFsaWQgZmQnLCA4IC8qIFdhc2lFcnJuby5FQkFERiAqLyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZHN0RW50cnkuZmQuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5mZHNbZHN0XSA9IHRoaXMuZmRzW3NyY107XG4gICAgICAgIHRoaXMuZmRzW2RzdF0uaWQgPSBkc3Q7XG4gICAgICAgIHRoaXMuZmRzW3NyY10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXNlZC0tO1xuICAgIH1cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmNvbnN0IFdlYkFzc2VtYmx5TWVtb3J5ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkgeyByZXR1cm4gX1dlYkFzc2VtYmx5Lk1lbW9yeTsgfSkoKTtcbi8qKiBAcHVibGljICovXG5jbGFzcyBNZW1vcnkgZXh0ZW5kcyBXZWJBc3NlbWJseU1lbW9yeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3IoZGVzY3JpcHRvcikge1xuICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgZ2V0IEhFQVA4KCkgeyByZXR1cm4gbmV3IEludDhBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IEhFQVBVOCgpIHsgcmV0dXJuIG5ldyBVaW50OEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDE2KCkgeyByZXR1cm4gbmV3IEludDE2QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTE2KCkgeyByZXR1cm4gbmV3IFVpbnQxNkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDMyKCkgeyByZXR1cm4gbmV3IEludDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTMyKCkgeyByZXR1cm4gbmV3IFVpbnQzMkFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUDY0KCkgeyByZXR1cm4gbmV3IEJpZ0ludDY0QXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQVTY0KCkgeyByZXR1cm4gbmV3IEJpZ1VpbnQ2NEFycmF5KHN1cGVyLmJ1ZmZlcik7IH1cbiAgICBnZXQgSEVBUEYzMigpIHsgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoc3VwZXIuYnVmZmVyKTsgfVxuICAgIGdldCBIRUFQRjY0KCkgeyByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShzdXBlci5idWZmZXIpOyB9XG4gICAgZ2V0IHZpZXcoKSB7IHJldHVybiBuZXcgRGF0YVZpZXcoc3VwZXIuYnVmZmVyKTsgfVxufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGV4dGVuZE1lbW9yeShtZW1vcnkpIHtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1lbW9yeSkgPT09IF9XZWJBc3NlbWJseS5NZW1vcnkucHJvdG90eXBlKSB7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihtZW1vcnksIE1lbW9yeS5wcm90b3R5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb3J5O1xufVxuXG5mdW5jdGlvbiBjaGVja1dlYkFzc2VtYmx5RnVuY3Rpb24oKSB7XG4gICAgY29uc3QgV2ViQXNzZW1ibHlGdW5jdGlvbiA9IF9XZWJBc3NlbWJseS5GdW5jdGlvbjtcbiAgICBpZiAodHlwZW9mIFdlYkFzc2VtYmx5RnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJBc3NlbWJseS5GdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQuJyArXG4gICAgICAgICAgICAnIElmIHlvdSBhcmUgdXNpbmcgVjggYmFzZWQgYnJvd3NlciBsaWtlIENocm9tZSwgdHJ5IHRvIHNwZWNpZnknICtcbiAgICAgICAgICAgICcgLS1qcy1mbGFncz1cIi0td2FzbS1zdGFnaW5nIC0tZXhwZXJpbWVudGFsLXdhc20tc3RhY2stc3dpdGNoaW5nXCInKTtcbiAgICB9XG4gICAgcmV0dXJuIFdlYkFzc2VtYmx5RnVuY3Rpb247XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jSW1wb3J0KGYsIHBhcmFtZXRlclR5cGUsIHJldHVyblR5cGUpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJUeXBlLnNsaWNlKDApO1xuICAgIHBhcmFtZXRlcnMudW5zaGlmdCgnZXh0ZXJucmVmJyk7XG4gICAgcmV0dXJuIG5ldyBXZWJBc3NlbWJseUZ1bmN0aW9uKHsgcGFyYW1ldGVycywgcmVzdWx0czogcmV0dXJuVHlwZSB9LCBmLCB7IHN1c3BlbmRpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEFzeW5jRXhwb3J0KGYpIHtcbiAgICBjb25zdCBXZWJBc3NlbWJseUZ1bmN0aW9uID0gY2hlY2tXZWJBc3NlbWJseUZ1bmN0aW9uKCk7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgV2ViQXNzZW1ibHlGdW5jdGlvbih7IHBhcmFtZXRlcnM6IFsuLi5XZWJBc3NlbWJseUZ1bmN0aW9uLnR5cGUoZikucGFyYW1ldGVycy5zbGljZSgxKV0sIHJlc3VsdHM6IFsnZXh0ZXJucmVmJ10gfSwgZiwgeyBwcm9taXNpbmc6ICdmaXJzdCcgfSk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gd3JhcEV4cG9ydHMoZXhwb3J0cywgbmVlZFdyYXApIHtcbiAgICByZXR1cm4gd3JhcEluc3RhbmNlRXhwb3J0cyhleHBvcnRzLCAoZXhwb3J0VmFsdWUsIG5hbWUpID0+IHtcbiAgICAgICAgbGV0IGlnbm9yZSA9IHR5cGVvZiBleHBvcnRWYWx1ZSAhPT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmVlZFdyYXApKSB7XG4gICAgICAgICAgICBpZ25vcmUgPSBpZ25vcmUgfHwgKG5lZWRXcmFwLmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWdub3JlID8gZXhwb3J0VmFsdWUgOiB3cmFwQXN5bmNFeHBvcnQoZXhwb3J0VmFsdWUpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjb3B5TWVtb3J5KHRhcmdldHMsIHNyYykge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCB8fCBzcmMubGVuZ3RoID09PSAwKVxuICAgICAgICByZXR1cm4gMDtcbiAgICBsZXQgY29waWVkID0gMDtcbiAgICBsZXQgbGVmdCA9IHNyYy5sZW5ndGggLSBjb3BpZWQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHNbaV07XG4gICAgICAgIGlmIChsZWZ0IDwgdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNldChzcmMuc3ViYXJyYXkoY29waWVkLCBjb3BpZWQgKyBsZWZ0KSwgMCk7XG4gICAgICAgICAgICBjb3BpZWQgKz0gbGVmdDtcbiAgICAgICAgICAgIGxlZnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGNvcGllZDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuc2V0KHNyYy5zdWJhcnJheShjb3BpZWQsIGNvcGllZCArIHRhcmdldC5sZW5ndGgpLCAwKTtcbiAgICAgICAgY29waWVkICs9IHRhcmdldC5sZW5ndGg7XG4gICAgICAgIGxlZnQgLT0gdGFyZ2V0Lmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNvcGllZDtcbn1cbmNvbnN0IF9tZW1vcnkgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX3dhc2kgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgX2ZzID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGdldE1lbW9yeSh3YXNpKSB7XG4gICAgcmV0dXJuIF9tZW1vcnkuZ2V0KHdhc2kpO1xufVxuZnVuY3Rpb24gZ2V0RnMod2FzaSkge1xuICAgIGNvbnN0IGZzID0gX2ZzLmdldCh3YXNpKTtcbiAgICBpZiAoIWZzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpbGVzeXN0ZW0gaXMgdW5hdmFpbGFibGUnKTtcbiAgICByZXR1cm4gZnM7XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgV2FzaUVycm9yKSB7XG4gICAgICAgIGlmICgoKHByb2Nlc3MuZW52Lk5PREVfRU5WKSkgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyci5lcnJubztcbiAgICB9XG4gICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICBjYXNlICdFTk9FTlQnOiByZXR1cm4gNDQgLyogV2FzaUVycm5vLkVOT0VOVCAqLztcbiAgICAgICAgY2FzZSAnRUJBREYnOiByZXR1cm4gOCAvKiBXYXNpRXJybm8uRUJBREYgKi87XG4gICAgICAgIGNhc2UgJ0VJTlZBTCc6IHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICBjYXNlICdFUEVSTSc6IHJldHVybiA2MyAvKiBXYXNpRXJybm8uRVBFUk0gKi87XG4gICAgICAgIGNhc2UgJ0VQUk9UTyc6IHJldHVybiA2NSAvKiBXYXNpRXJybm8uRVBST1RPICovO1xuICAgICAgICBjYXNlICdFRVhJU1QnOiByZXR1cm4gMjAgLyogV2FzaUVycm5vLkVFWElTVCAqLztcbiAgICAgICAgY2FzZSAnRU5PVERJUic6IHJldHVybiA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLztcbiAgICAgICAgY2FzZSAnRU1GSUxFJzogcmV0dXJuIDMzIC8qIFdhc2lFcnJuby5FTUZJTEUgKi87XG4gICAgICAgIGNhc2UgJ0VBQ0NFUyc6IHJldHVybiAyIC8qIFdhc2lFcnJuby5FQUNDRVMgKi87XG4gICAgICAgIGNhc2UgJ0VJU0RJUic6IHJldHVybiAzMSAvKiBXYXNpRXJybm8uRUlTRElSICovO1xuICAgICAgICBjYXNlICdFTk9URU1QVFknOiByZXR1cm4gNTUgLyogV2FzaUVycm5vLkVOT1RFTVBUWSAqLztcbiAgICAgICAgY2FzZSAnRU5PU1lTJzogcmV0dXJuIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi87XG4gICAgfVxuICAgIHRocm93IGVycjtcbn1cbmZ1bmN0aW9uIGRlZmluZU5hbWUobmFtZSwgZikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG4gICAgcmV0dXJuIGY7XG59XG5mdW5jdGlvbiBzeXNjYWxsV3JhcChzZWxmLCBuYW1lLCBmKSB7XG4gICAgcmV0dXJuIGRlZmluZU5hbWUobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9ERUJVR19OQVRJVkUgPT09ICd3YXNpJykge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBsZXQgZGVidWdBcmdzID0gW2Ake25hbWV9KCR7QXJyYXkuZnJvbSh7IGxlbmd0aDogYXJndW1lbnRzLmxlbmd0aCB9KS5tYXAoKCkgPT4gJyVkJykuam9pbignLCAnKX0pYF07XG4gICAgICAgICAgICBkZWJ1Z0FyZ3MgPSBkZWJ1Z0FyZ3MuY29uY2F0KGFyZ3MpO1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLCBkZWJ1Z0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgciA9IGYuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudGhlbihfID0+IF8sIGhhbmRsZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIHBhdGgsIGZsYWdzKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGgpO1xuICAgIGlmICgoZmxhZ3MgJiAxKSA9PT0gMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gZnMucmVhZGxpbmtTeW5jKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBwYXRoLCBmbGFncykge1xuICAgIGxldCByZXNvbHZlZFBhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBwYXRoKTtcbiAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRsaW5rKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRUlOVkFMJyAmJiBlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZWQtY29tbWVudFxuY29uc3QgZW5jb2RlciA9IC8qI19fUFVSRV9fKi8gbmV3IFRleHRFbmNvZGVyKCk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3BhY2VkLWNvbW1lbnRcbmNvbnN0IGRlY29kZXIgPSAvKiNfX1BVUkVfXyovIG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgSU5UNjRfTUFYID0gKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSAtIEJpZ0ludCgxKTtcbmZ1bmN0aW9uIHJlYWRTdGRpbigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHdpbmRvdy5wcm9tcHQoKTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSArICdcXG4nKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVGc3RGbGFnc09yUmV0dXJuKGZsYWdzKSB7XG4gICAgcmV0dXJuIChCb29sZWFuKChmbGFncykgJiB+KDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLyB8XG4gICAgICAgIDQgLyogV2FzaUZzdEZsYWcuU0VUX01USU0gKi8gfCA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykpIHx8XG4gICAgICAgICgoZmxhZ3MpICYgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykpID09PVxuICAgICAgICAgICAgKDEgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU0gKi8gfCAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgfHxcbiAgICAgICAgKChmbGFncykgJiAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSkgPT09XG4gICAgICAgICAgICAoNCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTSAqLyB8IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSk7XG59XG5jbGFzcyBXQVNJJDEge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MsIGVudiwgZmRzLCBhc3luY0ZzLCBmcywgYXN5bmNpZnkpIHtcbiAgICAgICAgdGhpcy5hcmdzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX2dldCcsIGZ1bmN0aW9uIChhcmd2LCBhcmd2X2J1Zikge1xuICAgICAgICAgICAgYXJndiA9IE51bWJlcihhcmd2KTtcbiAgICAgICAgICAgIGFyZ3ZfYnVmID0gTnVtYmVyKGFyZ3ZfYnVmKTtcbiAgICAgICAgICAgIGlmIChhcmd2ID09PSAwIHx8IGFyZ3ZfYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0SW50MzIoYXJndiwgYXJndl9idWYsIHRydWUpO1xuICAgICAgICAgICAgICAgIGFyZ3YgKz0gNDtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW5jb2Rlci5lbmNvZGUoYXJnICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgYXJndl9idWYpO1xuICAgICAgICAgICAgICAgIGFyZ3ZfYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcmdzX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdhcmdzX3NpemVzX2dldCcsIGZ1bmN0aW9uIChhcmdjLCBhcmd2X2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBhcmdjID0gTnVtYmVyKGFyZ2MpO1xuICAgICAgICAgICAgYXJndl9idWZfc2l6ZSA9IE51bWJlcihhcmd2X2J1Zl9zaXplKTtcbiAgICAgICAgICAgIGlmIChhcmdjID09PSAwIHx8IGFyZ3ZfYnVmX3NpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB3YXNpLmFyZ3M7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmdjLCBhcmdzLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihhcmd2X2J1Zl9zaXplLCBlbmNvZGVyLmVuY29kZShhcmdzLmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVudmlyb25fZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Vudmlyb25fZ2V0JywgZnVuY3Rpb24gKGVudmlyb24sIGVudmlyb25fYnVmKSB7XG4gICAgICAgICAgICBlbnZpcm9uID0gTnVtYmVyKGVudmlyb24pO1xuICAgICAgICAgICAgZW52aXJvbl9idWYgPSBOdW1iZXIoZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgaWYgKGVudmlyb24gPT09IDAgfHwgZW52aXJvbl9idWYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gd2FzaS5lbnY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBlbnZbaV07XG4gICAgICAgICAgICAgICAgdmlldy5zZXRJbnQzMihlbnZpcm9uLCBlbnZpcm9uX2J1ZiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW52aXJvbiArPSA0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVyLmVuY29kZShwYWlyICsgJ1xcMCcpO1xuICAgICAgICAgICAgICAgIEhFQVBVOC5zZXQoZGF0YSwgZW52aXJvbl9idWYpO1xuICAgICAgICAgICAgICAgIGVudmlyb25fYnVmICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lbnZpcm9uX3NpemVzX2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdlbnZpcm9uX3NpemVzX2dldCcsIGZ1bmN0aW9uIChsZW4sIGJ1Zmxlbikge1xuICAgICAgICAgICAgbGVuID0gTnVtYmVyKGxlbik7XG4gICAgICAgICAgICBidWZsZW4gPSBOdW1iZXIoYnVmbGVuKTtcbiAgICAgICAgICAgIGlmIChsZW4gPT09IDAgfHwgYnVmbGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihsZW4sIHdhc2kuZW52Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihidWZsZW4sIGVuY29kZXIuZW5jb2RlKHdhc2kuZW52LmpvaW4oJ1xcMCcpICsgJ1xcMCcpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3Jlc19nZXQgPSBzeXNjYWxsV3JhcCh0aGlzLCAnY2xvY2tfcmVzX2dldCcsIGZ1bmN0aW9uIChpZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgcmVzb2x1dGlvbiA9IE51bWJlcihyZXNvbHV0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogV2FzaUNsb2NraWQuUkVBTFRJTUUgKi86XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KHJlc29sdXRpb24sIEJpZ0ludCgxMDAwMDAwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogV2FzaUNsb2NraWQuTU9OT1RPTklDICovOlxuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXNpQ2xvY2tpZC5QUk9DRVNTX0NQVVRJTUVfSUQgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFdhc2lDbG9ja2lkLlRIUkVBRF9DUFVUSU1FX0lEICovOlxuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChyZXNvbHV0aW9uLCBCaWdJbnQoMTAwMCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNsb2NrX3RpbWVfZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2Nsb2NrX3RpbWVfZ2V0JywgZnVuY3Rpb24gKGlkLCBfcGVyY2lzaW9uLCB0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gTnVtYmVyKHRpbWUpO1xuICAgICAgICAgICAgaWYgKHRpbWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgc3dpdGNoIChpZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBXYXNpQ2xvY2tpZC5SRUFMVElNRSAqLzpcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQodGltZSwgQmlnSW50KERhdGUubm93KCkpICogQmlnSW50KDEwMDAwMDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBXYXNpQ2xvY2tpZC5NT05PVE9OSUMgKi86XG4gICAgICAgICAgICAgICAgY2FzZSAyIC8qIFdhc2lDbG9ja2lkLlBST0NFU1NfQ1BVVElNRV9JRCAqLzpcbiAgICAgICAgICAgICAgICBjYXNlIDMgLyogV2FzaUNsb2NraWQuVEhSRUFEX0NQVVRJTUVfSUQgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gTWF0aC50cnVuYyh0KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXMgPSBNYXRoLmZsb29yKCh0IC0gcykgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gQmlnSW50KHMpICogQmlnSW50KDEwMDAwMDAwMDApICsgQmlnSW50KG1zKSAqIEJpZ0ludCgxMDAwMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQodGltZSwgcmVzdWx0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmRfYWR2aXNlID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2FkdmlzZScsIGZ1bmN0aW9uIChfZmQsIF9vZmZzZXQsIF9sZW4sIF9hZHZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybiA1MiAvKiBXYXNpRXJybm8uRU5PU1lTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9mZHN0YXRfZ2V0ID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2Zkc3RhdF9nZXQnLCBmdW5jdGlvbiAoZmQsIGZkc3RhdCkge1xuICAgICAgICAgICAgZmRzdGF0ID0gTnVtYmVyKGZkc3RhdCk7XG4gICAgICAgICAgICBpZiAoZmRzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MTYoZmRzdGF0LCBmaWxlRGVzY3JpcHRvci50eXBlLCB0cnVlKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KGZkc3RhdCArIDIsIDAsIHRydWUpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoZmRzdGF0ICsgOCwgZmlsZURlc2NyaXB0b3IucmlnaHRzQmFzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChmZHN0YXQgKyAxNiwgZmlsZURlc2NyaXB0b3IucmlnaHRzSW5oZXJpdGluZywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX2Zkc3RhdF9zZXRfZmxhZ3MgPSBzeXNjYWxsV3JhcCh0aGlzLCAnZmRfZmRzdGF0X3NldF9mbGFncycsIGZ1bmN0aW9uIChfZmQsIF9mbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIDUyIC8qIFdhc2lFcnJuby5FTk9TWVMgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX2Zkc3RhdF9zZXRfcmlnaHRzID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX2Zkc3RhdF9zZXRfcmlnaHRzJywgZnVuY3Rpb24gKGZkLCByaWdodHNCYXNlLCByaWdodHNJbmhlcml0aW5nKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIEJpZ0ludCgwKSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICgocmlnaHRzQmFzZSB8IGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0Jhc2UpID4gZmlsZURlc2NyaXB0b3IucmlnaHRzQmFzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiA3NiAvKiBXYXNpRXJybm8uRU5PVENBUEFCTEUgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHJpZ2h0c0luaGVyaXRpbmcgfCBmaWxlRGVzY3JpcHRvci5yaWdodHNJbmhlcml0aW5nKSA+XG4gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3IucmlnaHRzSW5oZXJpdGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA3NiAvKiBXYXNpRXJybm8uRU5PVENBUEFCTEUgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5yaWdodHNCYXNlID0gcmlnaHRzQmFzZTtcbiAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnJpZ2h0c0luaGVyaXRpbmcgPSByaWdodHNJbmhlcml0aW5nO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9wcmVzdGF0X2dldCA9IHN5c2NhbGxXcmFwKHRoaXMsICdmZF9wcmVzdGF0X2dldCcsIGZ1bmN0aW9uIChmZCwgcHJlc3RhdCkge1xuICAgICAgICAgICAgcHJlc3RhdCA9IE51bWJlcihwcmVzdGF0KTtcbiAgICAgICAgICAgIGlmIChwcmVzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IGZpbGVEZXNjcmlwdG9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBXYXNpRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnIuZXJybm87XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVEZXNjcmlwdG9yLnByZW9wZW4gIT09IDEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIC8vIHByZW9wZW4gdHlwZSBpcyBkaXIoMClcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHByZXN0YXQsIDAsIHRydWUpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIocHJlc3RhdCArIDQsIGVuY29kZXIuZW5jb2RlKGZpbGVEZXNjcmlwdG9yLnBhdGgpLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmZkX3ByZXN0YXRfZGlyX25hbWUgPSBzeXNjYWxsV3JhcCh0aGlzLCAnZmRfcHJlc3RhdF9kaXJfbmFtZScsIGZ1bmN0aW9uIChmZCwgcGF0aCwgcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoZmlsZURlc2NyaXB0b3IucHJlb3BlbiAhPT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gOCAvKiBXYXNpRXJybm8uRUJBREYgKi87XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBlbmNvZGVyLmVuY29kZShmaWxlRGVzY3JpcHRvci5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHNpemUgPiBwYXRoX2xlbilcbiAgICAgICAgICAgICAgICByZXR1cm4gNDIgLyogV2FzaUVycm5vLkVOT0JVRlMgKi87XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgSEVBUFU4LnNldChidWZmZXIsIHBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF9zZWVrID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX3NlZWsnLCBmdW5jdGlvbiAoZmQsIG9mZnNldCwgd2hlbmNlLCBuZXdPZmZzZXQpIHtcbiAgICAgICAgICAgIG5ld09mZnNldCA9IE51bWJlcihuZXdPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKG5ld09mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZkID09PSAwIHx8IGZkID09PSAxIHx8IGZkID09PSAyKVxuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9TRUVLLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgciA9IGZpbGVEZXNjcmlwdG9yLnNlZWsob2Zmc2V0LCB3aGVuY2UpO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChuZXdPZmZzZXQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZF90ZWxsID0gc3lzY2FsbFdyYXAodGhpcywgJ2ZkX3RlbGwnLCBmdW5jdGlvbiAoZmQsIG9mZnNldCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1RFTEwsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBCaWdJbnQoZmlsZURlc2NyaXB0b3IucG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRCaWdVaW50NjQoTnVtYmVyKG9mZnNldCksIHBvcywgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBvbGxfb25lb2ZmID0gc3lzY2FsbFdyYXAodGhpcywgJ3BvbGxfb25lb2ZmJywgZnVuY3Rpb24gKGluX3B0ciwgb3V0X3B0ciwgbnN1YnNjcmlwdGlvbnMsIG5ldmVudHMpIHtcbiAgICAgICAgICAgIGluX3B0ciA9IE51bWJlcihpbl9wdHIpO1xuICAgICAgICAgICAgb3V0X3B0ciA9IE51bWJlcihvdXRfcHRyKTtcbiAgICAgICAgICAgIG5ldmVudHMgPSBOdW1iZXIobmV2ZW50cyk7XG4gICAgICAgICAgICBuc3Vic2NyaXB0aW9ucyA9IE51bWJlcihuc3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgICBuc3Vic2NyaXB0aW9ucyA9IG5zdWJzY3JpcHRpb25zID4+PiAwO1xuICAgICAgICAgICAgaWYgKGluX3B0ciA9PT0gMCB8fCBvdXRfcHRyID09PSAwIHx8IG5zdWJzY3JpcHRpb25zID09PSAwIHx8IG5ldmVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgMCwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgdGltZXJfdXNlcmRhdGEgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBsZXQgY3VyX3RpbWVvdXQgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBsZXQgaGFzX3RpbWVvdXQgPSAwO1xuICAgICAgICAgICAgbGV0IG1pbl90aW1lb3V0ID0gQmlnSW50KDApO1xuICAgICAgICAgICAgbGV0IHN1YjtcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBBcnJheShuc3Vic2NyaXB0aW9ucyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnN1YnNjcmlwdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHN1YiA9IGluX3B0ciArIGkgKiA0ODtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyZGF0YSA9IHZpZXcuZ2V0QmlnVWludDY0KHN1YiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHZpZXcuZ2V0VWludDgoc3ViICsgOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xvY2tJZE9yRmQgPSB2aWV3LmdldFVpbnQzMihzdWIgKyAxNiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHZpZXcuZ2V0QmlnVWludDY0KHN1YiArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVjaXNpb24gPSB2aWV3LmdldEJpZ1VpbnQ2NChzdWIgKyAzMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhZ3MgPSB2aWV3LmdldFVpbnQxNihzdWIgKyA0MCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXNlcmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfaWQ6IGNsb2NrSWRPckZkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmRfcmVhZHdyaXRlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQ6IGNsb2NrSWRPckZkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmRldmVudHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc3Vic2NyaXB0aW9uczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3ViID0gc3Vic2NyaXB0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Yi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBXYXNpRXZlbnRUeXBlLkNMT0NLICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViLnUuY2xvY2suZmxhZ3MgPT09IDEgLyogV2FzaVN1YmNsb2NrZmxhZ3MuQUJTVElNRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgYWJzb2x1dGUgdGltZSB0byByZWxhdGl2ZSBkZWxheS4gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBCaWdJbnQoRGF0ZS5ub3coKSkgKiBCaWdJbnQoMTAwMDAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWVvdXQgPSBzdWIudS5jbG9jay50aW1lb3V0IC0gbm93O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RpbWVvdXQgPSBzdWIudS5jbG9jay50aW1lb3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc190aW1lb3V0ID09PSAwIHx8IGN1cl90aW1lb3V0IDwgbWluX3RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdGltZW91dCA9IGN1cl90aW1lb3V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX3VzZXJkYXRhID0gc3ViLnVzZXJkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc190aW1lb3V0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBXYXNpRXZlbnRUeXBlLkZEX1JFQUQgKi86XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBXYXNpRXZlbnRUeXBlLkZEX1dSSVRFICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmRldmVudHMucHVzaChzdWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmZGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZkZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZkZXZlbnQgPSBmZGV2ZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBvdXRfcHRyICsgMzIgKiBpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldEJpZ1VpbnQ2NChldmVudCwgZmRldmVudC51c2VyZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgOCwgNTIgLyogV2FzaUVycm5vLkVOT1NZUyAqLywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGV2ZW50ICsgMTIsIGZkZXZlbnQudHlwZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KGV2ZW50ICsgMTYsIEJpZ0ludCgwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KGV2ZW50ICsgMjQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihuZXZlbnRzLCAxLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIobmV2ZW50cywgZmRldmVudHMubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzX3RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IE51bWJlcihtaW5fdGltZW91dCAvIEJpZ0ludCgxMDAwMDAwKSk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGlzTWFpblRocmVhZCB8fCB0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzbGVlcEJyZWFrSWYoZGVsYXksICgpID0+IGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgYnVmID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDQpXG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBhcnIgPSBuZXcgSW50MzJBcnJheShidWYpXG4gICAgICAgICAgICAgICAgLy8gICBwb3N0TXNnKHtcbiAgICAgICAgICAgICAgICAvLyAgICAgX190eWJ5c193YXNtX3V0aWxfd2FzaV9fOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogJ3NldC10aW1lb3V0JyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBidWZmZXI6IGJ1ZixcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRlbGF5XG4gICAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICB9KVxuICAgICAgICAgICAgICAgIC8vICAgQXRvbWljcy53YWl0KGFyciwgMCwgMClcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBvdXRfcHRyO1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0QmlnVWludDY0KGV2ZW50LCB0aW1lcl91c2VyZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoZXZlbnQgKyA4LCAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoZXZlbnQgKyAxMiwgMCAvKiBXYXNpRXZlbnRUeXBlLkNMT0NLICovLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihuZXZlbnRzLCAxLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvY19leGl0ID0gc3lzY2FsbFdyYXAodGhpcywgJ3Byb2NfZXhpdCcsIGZ1bmN0aW9uIChydmFsKSB7XG4gICAgICAgICAgICBpZiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpICYmICh0eXBlb2YgcHJvY2Vzcy5leGl0ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdChydmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvY19yYWlzZSA9IHN5c2NhbGxXcmFwKHRoaXMsICdwcm9jX3JhaXNlJywgZnVuY3Rpb24gKF9zaWcpIHtcbiAgICAgICAgICAgIHJldHVybiA1MiAvKiBXYXNpRXJybm8uRU5PU1lTICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zY2hlZF95aWVsZCA9IHN5c2NhbGxXcmFwKHRoaXMsICdzY2hlZF95aWVsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmFuZG9tX2dldCA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHN5c2NhbGxXcmFwKHRoaXMsICdyYW5kb21fZ2V0JywgZnVuY3Rpb24gKGJ1ZiwgYnVmX2xlbikge1xuICAgICAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgICAgIGlmIChidWYgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlcikgPT09ICdbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWY7IGkgPCBidWYgKyBidWZfbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDgoaSwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjU2KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcG9zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlkZSA9IDY1NTM2O1xuICAgICAgICAgICAgICAgIGZvciAocG9zID0gMDsgcG9zICsgc3RyaWRlIDwgYnVmX2xlbjsgcG9zICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEhFQVBVOC5zdWJhcnJheShidWYgKyBwb3MsIGJ1ZiArIHBvcyArIHN0cmlkZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEhFQVBVOC5zdWJhcnJheShidWYgKyBwb3MsIGJ1ZiArIGJ1Zl9sZW4pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBzeXNjYWxsV3JhcCh0aGlzLCAncmFuZG9tX2dldCcsIGZ1bmN0aW9uIChidWYsIGJ1Zl9sZW4pIHtcbiAgICAgICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWY7IGkgPCBidWYgKyBidWZfbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRVaW50OChpLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19yZWN2ID0gc3lzY2FsbFdyYXAodGhpcywgJ3NvY2tfcmVjdicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19zZW5kID0gc3lzY2FsbFdyYXAodGhpcywgJ3NvY2tfc2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ja19zaHV0ZG93biA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX3NodXRkb3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb2NrX2FjY2VwdCA9IHN5c2NhbGxXcmFwKHRoaXMsICdzb2NrX2FjY2VwdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiA1OCAvKiBXYXNpRXJybm8uRU5PVFNVUCAqLztcbiAgICAgICAgfSk7XG4gICAgICAgIF93YXNpLnNldCh0aGlzLCB7XG4gICAgICAgICAgICBmZHMsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZW52XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZnMpXG4gICAgICAgICAgICBfZnMuc2V0KHRoaXMsIGZzKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gZGVmaW5lSW1wb3J0KG5hbWUsIHN5bmNWZXJzaW9uLCBhc3luY1ZlcnNpb24sIHBhcmFtZXRlclR5cGUsIHJldHVyblR5cGUpIHtcbiAgICAgICAgICAgIGlmIChhc3luY0ZzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jaWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzW25hbWVdID0gYXN5bmNpZnkud3JhcEltcG9ydEZ1bmN0aW9uKHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBhc3luY1ZlcnNpb24pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzW25hbWVdID0gd3JhcEFzeW5jSW1wb3J0KHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBhc3luY1ZlcnNpb24pLCBwYXJhbWV0ZXJUeXBlLCByZXR1cm5UeXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdGhpc1tuYW1lXSA9IHN5c2NhbGxXcmFwKF90aGlzLCBuYW1lLCBzeW5jVmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9hbGxvY2F0ZScsIGZ1bmN0aW9uIGZkX2FsbG9jYXRlKGZkLCBvZmZzZXQsIGxlbikge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9BTExPQ0FURSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5mc3RhdFN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuc2l6ZSA8IG9mZnNldCArIGxlbikge1xuICAgICAgICAgICAgICAgIGZzLmZ0cnVuY2F0ZVN5bmMoZmlsZURlc2NyaXB0b3IuZmQsIE51bWJlcihvZmZzZXQgKyBsZW4pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfYWxsb2NhdGUoZmQsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfQUxMT0NBVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgaC5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuc2l6ZSA8IG9mZnNldCArIGxlbikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGgudHJ1bmNhdGUoTnVtYmVyKG9mZnNldCArIGxlbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpNjQnLCAnZjY0J10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX2Nsb3NlJywgZnVuY3Rpb24gZmRfY2xvc2UoZmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgQmlnSW50KDApLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmaWxlRGVzY3JpcHRvci5mZCk7XG4gICAgICAgICAgICB3YXNpLmZkcy5yZW1vdmUoZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9jbG9zZShmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBCaWdJbnQoMCksIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC5jbG9zZSgpO1xuICAgICAgICAgICAgd2FzaS5mZHMucmVtb3ZlKGZkKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZGF0YXN5bmMnLCBmdW5jdGlvbiBmZF9kYXRhc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0RBVEFTWU5DLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLmZkYXRhc3luY1N5bmMoZmlsZURlc2NyaXB0b3IuZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9kYXRhc3luYyhmZCkge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX0RBVEFTWU5DLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQuZGF0YXN5bmMoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZmlsZXN0YXRfZ2V0JywgZnVuY3Rpb24gZmRfZmlsZXN0YXRfZ2V0KGZkLCBidWYpIHtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdCA9IGZzLmZzdGF0U3luYyhmaWxlRGVzY3JpcHRvci5mZCwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBjb25zdCB7IHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIHRvRmlsZVN0YXQodmlldywgYnVmLCBzdGF0KTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfZ2V0KGZkLCBidWYpIHtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgaC5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICB0b0ZpbGVTdGF0KHZpZXcsIGJ1Ziwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9maWxlc3RhdF9zZXRfc2l6ZScsIGZ1bmN0aW9uIGZkX2ZpbGVzdGF0X3NldF9zaXplKGZkLCBzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1NJWkUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuZnRydW5jYXRlU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgTnVtYmVyKHNpemUpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3NpemUoZmQsIHNpemUpIHtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9GSUxFU1RBVF9TRVRfU0laRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGggPSBmaWxlRGVzY3JpcHRvci5mZDtcbiAgICAgICAgICAgIGF3YWl0IGgudHJ1bmNhdGUoTnVtYmVyKHNpemUpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTY0J10sIFsnaTMyJ10pO1xuICAgICAgICBmdW5jdGlvbiBmZEZpbGVzdGF0R2V0VGltZXMoZmQsIGF0aW0sIG10aW0sIGZsYWdzKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfRklMRVNUQVRfU0VUX1RJTUVTLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSA9PT0gMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pIHtcbiAgICAgICAgICAgICAgICBhdGltID0gQmlnSW50KERhdGUubm93KCkgKiAxMDAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykgPT09IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgbXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmaWxlRGVzY3JpcHRvciwgYXRpbSwgbXRpbSB9O1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfZmlsZXN0YXRfc2V0X3RpbWVzJywgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBhdGltLCBtdGltLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRnN0RmxhZ3NPclJldHVybihmbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZmlsZURlc2NyaXB0b3IsIGF0aW06IGF0aW1SZXMsIG10aW06IG10aW1SZXMgfSA9IGZkRmlsZXN0YXRHZXRUaW1lcy5jYWxsKHRoaXMsIGZkLCBhdGltLCBtdGltLCBmbGFncyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMuZnV0aW1lc1N5bmMoZmlsZURlc2NyaXB0b3IuZmQsIE51bWJlcihhdGltUmVzKSwgTnVtYmVyKG10aW1SZXMpKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBhdGltLCBtdGltLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRnN0RmxhZ3NPclJldHVybihmbGFncykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgZmlsZURlc2NyaXB0b3IsIGF0aW06IGF0aW1SZXMsIG10aW06IG10aW1SZXMgfSA9IGZkRmlsZXN0YXRHZXRUaW1lcy5jYWxsKHRoaXMsIGZkLCBhdGltLCBtdGltLCBmbGFncyk7XG4gICAgICAgICAgICBjb25zdCBoID0gZmlsZURlc2NyaXB0b3IuZmQ7XG4gICAgICAgICAgICBhd2FpdCBoLnV0aW1lcyhOdW1iZXIoYXRpbVJlcyksIE51bWJlcihtdGltUmVzKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3ByZWFkJywgZnVuY3Rpb24gZmRfcHJlYWQoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCB8IFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgU2hhcmVkQXJyYXlCdWZmZXIodG90YWxTaXplKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICBidWZmZXIuX2lzQnVmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIob2Zmc2V0KSk7XG4gICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSkgOiAwO1xuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgbnJlYWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiAoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRCB8IFdhc2lSaWdodHMuRkRfU0VFSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgICAgICAgICAgY29uc3QgaW9WZWNzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBidWZMZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB7IGJ5dGVzUmVhZCB9ID0gYXdhaXQgZmlsZURlc2NyaXB0b3IuZmQucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIG5yZWFkID0gYnVmZmVyID8gY29weU1lbW9yeShpb1ZlY3MsIGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKSA6IDA7XG4gICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCBucmVhZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9wd3JpdGUnLCBmdW5jdGlvbiBmZF9wd3JpdGUoZmQsIGlvdnMsIGlvdnNsZW4sIG9mZnNldCwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCB8fCBvZmZzZXQgPiBJTlQ2NF9NQVgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfV1JJVEUgfCBXYXNpUmlnaHRzLkZEX1NFRUssIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBjb25jYXRCdWZmZXIoQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IG53cml0dGVuID0gZnMud3JpdGVTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG53cml0dGVuLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcHdyaXRlKGZkLCBpb3ZzLCBpb3ZzbGVuLCBvZmZzZXQsIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDAgfHwgb2Zmc2V0ID4gSU5UNjRfTUFYKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLkZEX1dSSVRFIHwgV2FzaVJpZ2h0cy5GRF9TRUVLLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gY29uY2F0QnVmZmVyKEFycmF5LmZyb20oeyBsZW5ndGg6IE51bWJlcihpb3ZzbGVuKSB9LCAoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGlvdnMgKyAoaSAqIDgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IHZpZXcuZ2V0SW50MzIob2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZMZW4gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHsgYnl0ZXNXcml0dGVuIH0gPSBhd2FpdCBmaWxlRGVzY3JpcHRvci5mZC53cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihvZmZzZXQpKTtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIGJ5dGVzV3JpdHRlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9yZWFkJywgZnVuY3Rpb24gZmRfcmVhZChmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFELCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgICAgICAgICBjb25zdCBpb1ZlY3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGJ1ZkxlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBpZiAoZmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5wcm9tcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIgPSByZWFkU3RkaW4oKTtcbiAgICAgICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIpIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFNoYXJlZEFycmF5QnVmZmVyKHRvdGFsU2l6ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBieXRlc1JlYWQgPSBmcy5yZWFkU3luYyhmaWxlRGVzY3JpcHRvci5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIoZmlsZURlc2NyaXB0b3IucG9zKSk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpIDogMDtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG5yZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG5yZWFkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfcmVhZChmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFELCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgaWYgKCFpb3ZzbGVuKSB7XG4gICAgICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgICAgICAgICBjb25zdCBpb1ZlY3MgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGJ1ZkxlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gSEVBUFU4LnN1YmFycmF5KGJ1ZiwgYnVmICsgYnVmTGVuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgICAgIGxldCBucmVhZCA9IDA7XG4gICAgICAgICAgICBpZiAoZmQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5wcm9tcHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU4IC8qIFdhc2lFcnJuby5FTk9UU1VQICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmZXIgPSByZWFkU3RkaW4oKTtcbiAgICAgICAgICAgICAgICBucmVhZCA9IGJ1ZmZlciA/IGNvcHlNZW1vcnkoaW9WZWNzLCBidWZmZXIpIDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICAgICAgYnVmZmVyLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBOdW1iZXIoZmlsZURlc2NyaXB0b3IucG9zKSk7XG4gICAgICAgICAgICAgICAgbnJlYWQgPSBidWZmZXIgPyBjb3B5TWVtb3J5KGlvVmVjcywgYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpIDogMDtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG5yZWFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG5yZWFkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfcmVhZGRpcicsIGZ1bmN0aW9uIGZkX3JlYWRkaXIoZmQsIGJ1ZiwgYnVmX2xlbiwgY29va2llLCBidWZ1c2VkKSB7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICBidWZ1c2VkID0gTnVtYmVyKGJ1ZnVzZWQpO1xuICAgICAgICAgICAgaWYgKGJ1ZiA9PT0gMCB8fCBidWZ1c2VkID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9SRUFERElSLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGxldCBidWZmZXJVc2VkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBOdW1iZXIoY29va2llKTsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRGF0YSA9IGVuY29kZXIuZW5jb2RlKGVudHJpZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlJbmZvID0gZnMuc3RhdFN5bmMocmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgZW50cmllc1tpXS5uYW1lKSwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlEYXRhID0gbmV3IFVpbnQ4QXJyYXkoMjQgKyBuYW1lRGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeVZpZXcgPSBuZXcgRGF0YVZpZXcoZW50cnlEYXRhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZW50cnlWaWV3LnNldEJpZ1VpbnQ2NCgwLCBCaWdJbnQoaSArIDEpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0QmlnVWludDY0KDgsIEJpZ0ludChlbnRyeUluZm8uaW5vID8gZW50cnlJbmZvLmlubyA6IDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDMyKDE2LCBuYW1lRGF0YS5ieXRlTGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cmllc1tpXS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNCAvKiBXYXNpRmlsZVR5cGUuUkVHVUxBUl9GSUxFICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA3IC8qIFdhc2lGaWxlVHlwZS5TWU1CT0xJQ19MSU5LICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzQ2hhcmFjdGVyRGV2aWNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDIgLyogV2FzaUZpbGVUeXBlLkNIQVJBQ1RFUl9ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNCbG9ja0RldmljZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAxIC8qIFdhc2lGaWxlVHlwZS5CTE9DS19ERVZJQ0UgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNTb2NrZXQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gNiAvKiBXYXNpRmlsZVR5cGUuU09DS0VUX1NUUkVBTSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAwIC8qIFdhc2lGaWxlVHlwZS5VTktOT1dOICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0VWludDgoMjAsIHR5cGUpO1xuICAgICAgICAgICAgICAgIGVudHJ5RGF0YS5zZXQobmFtZURhdGEsIDI0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZW50cnlEYXRhLnNsaWNlKDAsIE1hdGgubWluKGVudHJ5RGF0YS5sZW5ndGgsIGJ1Zl9sZW4gLSBidWZmZXJVc2VkKSk7XG4gICAgICAgICAgICAgICAgSEVBUFU4LnNldChkYXRhLCBidWYgKyBidWZmZXJVc2VkKTtcbiAgICAgICAgICAgICAgICBidWZmZXJVc2VkICs9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGJ1ZmZlclVzZWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9yZWFkZGlyKGZkLCBidWYsIGJ1Zl9sZW4sIGNvb2tpZSwgYnVmdXNlZCkge1xuICAgICAgICAgICAgYnVmID0gTnVtYmVyKGJ1Zik7XG4gICAgICAgICAgICBidWZfbGVuID0gTnVtYmVyKGJ1Zl9sZW4pO1xuICAgICAgICAgICAgYnVmdXNlZCA9IE51bWJlcihidWZ1c2VkKTtcbiAgICAgICAgICAgIGlmIChidWYgPT09IDAgfHwgYnVmdXNlZCA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfUkVBRERJUiwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGxldCBidWZmZXJVc2VkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBOdW1iZXIoY29va2llKTsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRGF0YSA9IGVuY29kZXIuZW5jb2RlKGVudHJpZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnlJbmZvID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChyZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBlbnRyaWVzW2ldLm5hbWUpLCB7IGJpZ2ludDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeURhdGEgPSBuZXcgVWludDhBcnJheSgyNCArIG5hbWVEYXRhLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5VmlldyA9IG5ldyBEYXRhVmlldyhlbnRyeURhdGEuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbnRyeVZpZXcuc2V0QmlnVWludDY0KDAsIEJpZ0ludChpICsgMSksIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRCaWdVaW50NjQoOCwgQmlnSW50KGVudHJ5SW5mby5pbm8gPyBlbnRyeUluZm8uaW5vIDogMCksIHRydWUpO1xuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRVaW50MzIoMTYsIG5hbWVEYXRhLmJ5dGVMZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgICAgIGxldCB0eXBlO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA0IC8qIFdhc2lGaWxlVHlwZS5SRUdVTEFSX0ZJTEUgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMyAvKiBXYXNpRmlsZVR5cGUuRElSRUNUT1JZICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyaWVzW2ldLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDcgLyogV2FzaUZpbGVUeXBlLlNZTUJPTElDX0xJTksgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJpZXNbaV0uaXNDaGFyYWN0ZXJEZXZpY2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gMiAvKiBXYXNpRmlsZVR5cGUuQ0hBUkFDVEVSX0RFVklDRSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDEgLyogV2FzaUZpbGVUeXBlLkJMT0NLX0RFVklDRSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cmllc1tpXS5pc1NvY2tldCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSA2IC8qIFdhc2lGaWxlVHlwZS5TT0NLRVRfU1RSRUFNICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IDAgLyogV2FzaUZpbGVUeXBlLlVOS05PV04gKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudHJ5Vmlldy5zZXRVaW50OCgyMCwgdHlwZSk7XG4gICAgICAgICAgICAgICAgZW50cnlEYXRhLnNldChuYW1lRGF0YSwgMjQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBlbnRyeURhdGEuc2xpY2UoMCwgTWF0aC5taW4oZW50cnlEYXRhLmxlbmd0aCwgYnVmX2xlbiAtIGJ1ZmZlclVzZWQpKTtcbiAgICAgICAgICAgICAgICBIRUFQVTguc2V0KGRhdGEsIGJ1ZiArIGJ1ZmZlclVzZWQpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlclVzZWQgKz0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoYnVmdXNlZCwgYnVmZmVyVXNlZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTY0JywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdmZF9yZW51bWJlcicsIGZ1bmN0aW9uIGZkX3JlbnVtYmVyKGZyb20sIHRvKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgd2FzaS5mZHMucmVudW1iZXIodG8sIGZyb20pO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9yZW51bWJlcihmcm9tLCB0bykge1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IHdhc2kuZmRzLnJlbnVtYmVyKHRvLCBmcm9tKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ2ZkX3N5bmMnLCBmdW5jdGlvbiBmZF9zeW5jKGZkKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5mc3luY1N5bmMoZmlsZURlc2NyaXB0b3IuZmQpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBmZF9zeW5jKGZkKSB7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfU1lOQywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGF3YWl0IGZpbGVEZXNjcmlwdG9yLmZkLnN5bmMoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgnZmRfd3JpdGUnLCBmdW5jdGlvbiBmZF93cml0ZShmZCwgaW92cywgaW92c2xlbiwgc2l6ZSkge1xuICAgICAgICAgICAgaW92cyA9IE51bWJlcihpb3ZzKTtcbiAgICAgICAgICAgIHNpemUgPSBOdW1iZXIoc2l6ZSk7XG4gICAgICAgICAgICBpZiAoKGlvdnMgPT09IDAgJiYgaW92c2xlbikgfHwgc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5GRF9XUklURSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICghaW92c2xlbikge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGNvbmNhdEJ1ZmZlcihBcnJheS5mcm9tKHsgbGVuZ3RoOiBOdW1iZXIoaW92c2xlbikgfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpb3ZzICsgKGkgKiA4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBidWYgPSB2aWV3LmdldEludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmTGVuID0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhFQVBVOC5zdWJhcnJheShidWYsIGJ1ZiArIGJ1Zkxlbik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBsZXQgbndyaXR0ZW47XG4gICAgICAgICAgICBpZiAoZmQgPT09IDEgfHwgZmQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBud3JpdHRlbiA9IGZpbGVEZXNjcmlwdG9yLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgICAgIG53cml0dGVuID0gZnMud3JpdGVTeW5jKGZpbGVEZXNjcmlwdG9yLmZkLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIE51bWJlcihmaWxlRGVzY3JpcHRvci5wb3MpKTtcbiAgICAgICAgICAgICAgICBmaWxlRGVzY3JpcHRvci5wb3MgKz0gQmlnSW50KG53cml0dGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKHNpemUsIG53cml0dGVuLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gZmRfd3JpdGUoZmQsIGlvdnMsIGlvdnNsZW4sIHNpemUpIHtcbiAgICAgICAgICAgIGlvdnMgPSBOdW1iZXIoaW92cyk7XG4gICAgICAgICAgICBzaXplID0gTnVtYmVyKHNpemUpO1xuICAgICAgICAgICAgaWYgKChpb3ZzID09PSAwICYmIGlvdnNsZW4pIHx8IHNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuRkRfV1JJVEUsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBpZiAoIWlvdnNsZW4pIHtcbiAgICAgICAgICAgICAgICB2aWV3LnNldFVpbnQzMihzaXplLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBjb25jYXRCdWZmZXIoQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKGlvdnNsZW4pIH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gaW92cyArIChpICogOCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gdmlldy5nZXRJbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZkxlbiA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBIRUFQVTguc3ViYXJyYXkoYnVmLCBidWYgKyBidWZMZW4pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgbGV0IG53cml0dGVuO1xuICAgICAgICAgICAgaWYgKGZkID09PSAxIHx8IGZkID09PSAyKSB7XG4gICAgICAgICAgICAgICAgbndyaXR0ZW4gPSBmaWxlRGVzY3JpcHRvci53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbndyaXR0ZW4gPSBhd2FpdCAoYXdhaXQgKGZpbGVEZXNjcmlwdG9yLmZkLndyaXRlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgTnVtYmVyKGZpbGVEZXNjcmlwdG9yLnBvcykpKSkuYnl0ZXNXcml0dGVuO1xuICAgICAgICAgICAgICAgIGZpbGVEZXNjcmlwdG9yLnBvcyArPSBCaWdJbnQobndyaXR0ZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmlldy5zZXRVaW50MzIoc2l6ZSwgbndyaXR0ZW4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX2NyZWF0ZV9kaXJlY3RvcnknLCBmdW5jdGlvbiBwYXRoX2NyZWF0ZV9kaXJlY3RvcnkoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9DUkVBVEVfRElSRUNUT1JZLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX2NyZWF0ZV9kaXJlY3RvcnkoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9DUkVBVEVfRElSRUNUT1JZLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9maWxlc3RhdF9nZXQnLCBmdW5jdGlvbiBwYXRoX2ZpbGVzdGF0X2dldChmZCwgZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBmaWxlc3RhdCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGZpbGVzdGF0ID0gTnVtYmVyKGZpbGVzdGF0KTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGZpbGVzdGF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCwgdmlldyB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfRklMRVNUQVRfR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgbGV0IHN0YXQ7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgMSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMocGF0aFN0cmluZywgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGF0ID0gZnMubHN0YXRTeW5jKHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9GaWxlU3RhdCh2aWV3LCBmaWxlc3RhdCwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfZ2V0KGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGZpbGVzdGF0KSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgZmlsZXN0YXQgPSBOdW1iZXIoZmlsZXN0YXQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgZmlsZXN0YXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9GSUxFU1RBVF9HRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICBsZXQgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBsZXQgc3RhdDtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAxKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KHBhdGhTdHJpbmcsIHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9GaWxlU3RhdCh2aWV3LCBmaWxlc3RhdCwgc3RhdCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX2ZpbGVzdGF0X3NldF90aW1lcycsIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGF0aW0sIG10aW0sIGZzdF9mbGFncykge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZnN0X2ZsYWdzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoU3luYyhmcywgZmlsZURlc2NyaXB0b3IsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKSwgZmxhZ3MpO1xuICAgICAgICAgICAgaWYgKChmc3RfZmxhZ3MgJiAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykgPT09IDIgLyogV2FzaUZzdEZsYWcuU0VUX0FUSU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgYXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzdF9mbGFncyAmIDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSA9PT0gOCAvKiBXYXNpRnN0RmxhZy5TRVRfTVRJTV9OT1cgKi8pIHtcbiAgICAgICAgICAgICAgICBtdGltID0gQmlnSW50KERhdGUubm93KCkgKiAxMDAwMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZzLnV0aW1lc1N5bmMocmVzb2x2ZWRQYXRoLCBOdW1iZXIoYXRpbSksIE51bWJlcihtdGltKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfZmlsZXN0YXRfc2V0X3RpbWVzKGZkLCBmbGFncywgcGF0aCwgcGF0aF9sZW4sIGF0aW0sIG10aW0sIGZzdF9mbGFncykge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX0ZJTEVTVEFUX1NFVF9USU1FUywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUZzdEZsYWdzT3JSZXR1cm4oZnN0X2ZsYWdzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSksIGZsYWdzKTtcbiAgICAgICAgICAgIGlmICgoZnN0X2ZsYWdzICYgMiAvKiBXYXNpRnN0RmxhZy5TRVRfQVRJTV9OT1cgKi8pID09PSAyIC8qIFdhc2lGc3RGbGFnLlNFVF9BVElNX05PVyAqLykge1xuICAgICAgICAgICAgICAgIGF0aW0gPSBCaWdJbnQoRGF0ZS5ub3coKSAqIDEwMDAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChmc3RfZmxhZ3MgJiA4IC8qIFdhc2lGc3RGbGFnLlNFVF9NVElNX05PVyAqLykgPT09IDggLyogV2FzaUZzdEZsYWcuU0VUX01USU1fTk9XICovKSB7XG4gICAgICAgICAgICAgICAgbXRpbSA9IEJpZ0ludChEYXRlLm5vdygpICogMTAwMDAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51dGltZXMocmVzb2x2ZWRQYXRoLCBOdW1iZXIoYXRpbSksIE51bWJlcihtdGltKSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfbGluaycsIGZ1bmN0aW9uIHBhdGhfbGluayhvbGRfZmQsIG9sZF9mbGFncywgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfU09VUkNFIHwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9MSU5LX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTggfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9sZFBhdGggPSByZXNvbHZlUGF0aFN5bmMoZnMsIG9sZFdyYXAsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSwgb2xkX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTmV3UGF0aCA9IHJlc29sdmUobmV3V3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG5ld19wYXRoLCBuZXdfcGF0aCArIG5ld19wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGZzLmxpbmtTeW5jKHJlc29sdmVkT2xkUGF0aCwgcmVzb2x2ZWROZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9saW5rKG9sZF9mZCwgb2xkX2ZsYWdzLCBvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBuZXdfZmQsIG5ld19wYXRoLCBuZXdfcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIG9sZF9wYXRoID0gTnVtYmVyKG9sZF9wYXRoKTtcbiAgICAgICAgICAgIG9sZF9wYXRoX2xlbiA9IE51bWJlcihvbGRfcGF0aF9sZW4pO1xuICAgICAgICAgICAgbmV3X3BhdGggPSBOdW1iZXIobmV3X3BhdGgpO1xuICAgICAgICAgICAgbmV3X3BhdGhfbGVuID0gTnVtYmVyKG5ld19wYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAob2xkX3BhdGggPT09IDAgfHwgbmV3X3BhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBsZXQgb2xkV3JhcDtcbiAgICAgICAgICAgIGxldCBuZXdXcmFwO1xuICAgICAgICAgICAgaWYgKG9sZF9mZCA9PT0gbmV3X2ZkKSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfTElOS19TT1VSQ0UgfCBXYXNpUmlnaHRzLlBBVEhfTElOS19UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvbGRXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX0xJTktfU09VUkNFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgICAgIG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQobmV3X2ZkLCBXYXNpUmlnaHRzLlBBVEhfTElOS19UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT2xkUGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIG9sZFdyYXAsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSwgb2xkX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTmV3UGF0aCA9IHJlc29sdmUobmV3V3JhcC5yZWFsUGF0aCwgZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIG5ld19wYXRoLCBuZXdfcGF0aCArIG5ld19wYXRoX2xlbikpKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmxpbmsocmVzb2x2ZWRPbGRQYXRoLCByZXNvbHZlZE5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZnVuY3Rpb24gcGF0aE9wZW4ob19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncykge1xuICAgICAgICAgICAgY29uc3QgcmVhZCA9IChmc19yaWdodHNfYmFzZSAmIChXYXNpUmlnaHRzLkZEX1JFQUQgfFxuICAgICAgICAgICAgICAgIFdhc2lSaWdodHMuRkRfUkVBRERJUikpICE9PSBCaWdJbnQoMCk7XG4gICAgICAgICAgICBjb25zdCB3cml0ZSA9IChmc19yaWdodHNfYmFzZSAmIChXYXNpUmlnaHRzLkZEX0RBVEFTWU5DIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX1dSSVRFIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX0FMTE9DQVRFIHxcbiAgICAgICAgICAgICAgICBXYXNpUmlnaHRzLkZEX0ZJTEVTVEFUX1NFVF9TSVpFKSkgIT09IEJpZ0ludCgwKTtcbiAgICAgICAgICAgIGxldCBmbGFncyA9IHdyaXRlID8gcmVhZCA/IDIgLyogRmlsZUNvbnRyb2xGbGFnLk9fUkRXUiAqLyA6IDEgLyogRmlsZUNvbnRyb2xGbGFnLk9fV1JPTkxZICovIDogMCAvKiBGaWxlQ29udHJvbEZsYWcuT19SRE9OTFkgKi87XG4gICAgICAgICAgICBsZXQgbmVlZGVkX2Jhc2UgPSBXYXNpUmlnaHRzLlBBVEhfT1BFTjtcbiAgICAgICAgICAgIGxldCBuZWVkZWRfaW5oZXJpdGluZyA9IGZzX3JpZ2h0c19iYXNlIHwgZnNfcmlnaHRzX2luaGVyaXRpbmc7XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAxIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19DUkVBVCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSA2NCAvKiBGaWxlQ29udHJvbEZsYWcuT19DUkVBVCAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfYmFzZSB8PSBXYXNpUmlnaHRzLlBBVEhfQ1JFQVRFX0ZJTEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAyIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19ESVJFQ1RPUlkgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gNjU1MzYgLyogRmlsZUNvbnRyb2xGbGFnLk9fRElSRUNUT1JZICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChvX2ZsYWdzICYgNCAvKiBXYXNpRmlsZUNvbnRyb2xGbGFnLk9fRVhDTCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAxMjggLyogRmlsZUNvbnRyb2xGbGFnLk9fRVhDTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgob19mbGFncyAmIDggLyogV2FzaUZpbGVDb250cm9sRmxhZy5PX1RSVU5DICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDUxMiAvKiBGaWxlQ29udHJvbEZsYWcuT19UUlVOQyAqLztcbiAgICAgICAgICAgICAgICBuZWVkZWRfYmFzZSB8PSBXYXNpUmlnaHRzLlBBVEhfRklMRVNUQVRfU0VUX1NJWkU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGZzX2ZsYWdzICYgMSAvKiBXYXNpRmRGbGFnLkFQUEVORCAqLykgIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAxMDI0IC8qIEZpbGVDb250cm9sRmxhZy5PX0FQUEVORCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiAyIC8qIFdhc2lGZEZsYWcuRFNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxhZ3MgfD0gRmlsZUNvbnRyb2xGbGFnLk9fRFNZTkM7XG4gICAgICAgICAgICAgICAgbmVlZGVkX2luaGVyaXRpbmcgfD0gV2FzaVJpZ2h0cy5GRF9EQVRBU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiA0IC8qIFdhc2lGZEZsYWcuTk9OQkxPQ0sgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMjA0OCAvKiBGaWxlQ29udHJvbEZsYWcuT19OT05CTE9DSyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiA4IC8qIFdhc2lGZEZsYWcuUlNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTA1MjY3MiAvKiBGaWxlQ29udHJvbEZsYWcuT19TWU5DICovO1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZnNfZmxhZ3MgJiAxNiAvKiBXYXNpRmRGbGFnLlNZTkMgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTA1MjY3MiAvKiBGaWxlQ29udHJvbEZsYWcuT19TWU5DICovO1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU1lOQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh3cml0ZSAmJiAoZmxhZ3MgJiAoMTAyNCAvKiBGaWxlQ29udHJvbEZsYWcuT19BUFBFTkQgKi8gfCA1MTIgLyogRmlsZUNvbnRyb2xGbGFnLk9fVFJVTkMgKi8pKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5lZWRlZF9pbmhlcml0aW5nIHw9IFdhc2lSaWdodHMuRkRfU0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGZsYWdzLCBuZWVkZWRfYmFzZSwgbmVlZGVkX2luaGVyaXRpbmcgfTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfb3BlbicsIGZ1bmN0aW9uIHBhdGhfb3BlbihkaXJmZCwgZGlyZmxhZ3MsIHBhdGgsIHBhdGhfbGVuLCBvX2ZsYWdzLCBmc19yaWdodHNfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcsIGZzX2ZsYWdzLCBmZCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIGZkID0gTnVtYmVyKGZkKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwIHx8IGZkID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBmc19yaWdodHNfYmFzZSA9IEJpZ0ludChmc19yaWdodHNfYmFzZSk7XG4gICAgICAgICAgICBmc19yaWdodHNfaW5oZXJpdGluZyA9IEJpZ0ludChmc19yaWdodHNfaW5oZXJpdGluZyk7XG4gICAgICAgICAgICBjb25zdCB7IGZsYWdzOiBmbGFnc1JlcywgbmVlZGVkX2Jhc2U6IG5lZWRlZEJhc2UsIG5lZWRlZF9pbmhlcml0aW5nOiBuZWVkZWRJbmhlcml0aW5nIH0gPSBwYXRoT3BlbihvX2ZsYWdzLCBmc19yaWdodHNfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcsIGZzX2ZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChkaXJmZCwgbmVlZGVkQmFzZSwgbmVlZGVkSW5oZXJpdGluZyk7XG4gICAgICAgICAgICBjb25zdCBtZW1vcnkgPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBIRUFQVTggPSBtZW1vcnkuSEVBUFU4O1xuICAgICAgICAgICAgY29uc3QgcGF0aFN0cmluZyA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBwYXRoLCBwYXRoICsgcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZF9wYXRoID0gcmVzb2x2ZVBhdGhTeW5jKGZzLCBmaWxlRGVzY3JpcHRvciwgcGF0aFN0cmluZywgZGlyZmxhZ3MpO1xuICAgICAgICAgICAgY29uc3QgciA9IGZzLm9wZW5TeW5jKHJlc29sdmVkX3BhdGgsIGZsYWdzUmVzLCAwbzY2Nik7XG4gICAgICAgICAgICBjb25zdCBmaWxldHlwZSA9IHdhc2kuZmRzLmdldEZpbGVUeXBlQnlGZChyKTtcbiAgICAgICAgICAgIGlmICgob19mbGFncyAmIDIgLyogV2FzaUZpbGVDb250cm9sRmxhZy5PX0RJUkVDVE9SWSAqLykgIT09IDAgJiYgZmlsZXR5cGUgIT09IDMgLyogV2FzaUZpbGVUeXBlLkRJUkVDVE9SWSAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiA1NCAvKiBXYXNpRXJybm8uRU5PVERJUiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgYmFzZTogbWF4X2Jhc2UsIGluaGVyaXRpbmc6IG1heF9pbmhlcml0aW5nIH0gPSBnZXRSaWdodHMod2FzaS5mZHMuc3RkaW8sIHIsIGZsYWdzUmVzLCBmaWxldHlwZSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwID0gd2FzaS5mZHMuaW5zZXJ0KHIsIHJlc29sdmVkX3BhdGgsIHJlc29sdmVkX3BhdGgsIGZpbGV0eXBlLCBmc19yaWdodHNfYmFzZSAmIG1heF9iYXNlLCBmc19yaWdodHNfaW5oZXJpdGluZyAmIG1heF9pbmhlcml0aW5nLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5mc3RhdFN5bmMociwgeyBiaWdpbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIHdyYXAuc2l6ZSA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoKGZsYWdzUmVzICYgMTAyNCAvKiBGaWxlQ29udHJvbEZsYWcuT19BUFBFTkQgKi8pICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXAucG9zID0gc3RhdC5zaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBtZW1vcnkudmlldztcbiAgICAgICAgICAgIHZpZXcuc2V0SW50MzIoZmQsIHdyYXAuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBhc3luYyBmdW5jdGlvbiBwYXRoX29wZW4oZGlyZmQsIGRpcmZsYWdzLCBwYXRoLCBwYXRoX2xlbiwgb19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncywgZmQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBmZCA9IE51bWJlcihmZCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBmZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2Jhc2UgPSBCaWdJbnQoZnNfcmlnaHRzX2Jhc2UpO1xuICAgICAgICAgICAgZnNfcmlnaHRzX2luaGVyaXRpbmcgPSBCaWdJbnQoZnNfcmlnaHRzX2luaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgeyBmbGFnczogZmxhZ3NSZXMsIG5lZWRlZF9iYXNlOiBuZWVkZWRCYXNlLCBuZWVkZWRfaW5oZXJpdGluZzogbmVlZGVkSW5oZXJpdGluZyB9ID0gcGF0aE9wZW4ob19mbGFncywgZnNfcmlnaHRzX2Jhc2UsIGZzX3JpZ2h0c19pbmhlcml0aW5nLCBmc19mbGFncyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZGlyZmQsIG5lZWRlZEJhc2UsIG5lZWRlZEluaGVyaXRpbmcpO1xuICAgICAgICAgICAgY29uc3QgbWVtb3J5ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgSEVBUFU4ID0gbWVtb3J5LkhFQVBVODtcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRfcGF0aCA9IGF3YWl0IHJlc29sdmVQYXRoQXN5bmMoZnMsIGZpbGVEZXNjcmlwdG9yLCBwYXRoU3RyaW5nLCBkaXJmbGFncyk7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgZnMucHJvbWlzZXMub3BlbihyZXNvbHZlZF9wYXRoLCBmbGFnc1JlcywgMG82NjYpO1xuICAgICAgICAgICAgY29uc3QgZmlsZXR5cGUgPSBhd2FpdCB3YXNpLmZkcy5nZXRGaWxlVHlwZUJ5RmQocik7XG4gICAgICAgICAgICBpZiAoKG9fZmxhZ3MgJiAyIC8qIFdhc2lGaWxlQ29udHJvbEZsYWcuT19ESVJFQ1RPUlkgKi8pICE9PSAwICYmIGZpbGV0eXBlICE9PSAzIC8qIFdhc2lGaWxlVHlwZS5ESVJFQ1RPUlkgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gNTQgLyogV2FzaUVycm5vLkVOT1RESVIgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IGJhc2U6IG1heF9iYXNlLCBpbmhlcml0aW5nOiBtYXhfaW5oZXJpdGluZyB9ID0gZ2V0UmlnaHRzKHdhc2kuZmRzLnN0ZGlvLCByLmZkLCBmbGFnc1JlcywgZmlsZXR5cGUpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcCA9IHdhc2kuZmRzLmluc2VydChyLCByZXNvbHZlZF9wYXRoLCByZXNvbHZlZF9wYXRoLCBmaWxldHlwZSwgZnNfcmlnaHRzX2Jhc2UgJiBtYXhfYmFzZSwgZnNfcmlnaHRzX2luaGVyaXRpbmcgJiBtYXhfaW5oZXJpdGluZywgMCk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgci5zdGF0KHsgYmlnaW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwLnNpemUgPSBzdGF0LnNpemU7XG4gICAgICAgICAgICAgICAgaWYgKChmbGFnc1JlcyAmIDEwMjQgLyogRmlsZUNvbnRyb2xGbGFnLk9fQVBQRU5EICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwLnBvcyA9IHN0YXQuc2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gbWVtb3J5LnZpZXc7XG4gICAgICAgICAgICB2aWV3LnNldEludDMyKGZkLCB3cmFwLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2k2NCcsICdpNjQnLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgZGVmaW5lSW1wb3J0KCdwYXRoX3JlYWRsaW5rJywgZnVuY3Rpb24gcGF0aF9yZWFkbGluayhmZCwgcGF0aCwgcGF0aF9sZW4sIGJ1ZiwgYnVmX2xlbiwgYnVmdXNlZCkge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGJ1ZiA9IE51bWJlcihidWYpO1xuICAgICAgICAgICAgYnVmX2xlbiA9IE51bWJlcihidWZfbGVuKTtcbiAgICAgICAgICAgIGJ1ZnVzZWQgPSBOdW1iZXIoYnVmdXNlZCk7XG4gICAgICAgICAgICBpZiAocGF0aCA9PT0gMCB8fCBidWYgPT09IDAgfHwgYnVmdXNlZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyOCAvKiBXYXNpRXJybm8uRUlOVkFMICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBIRUFQVTgsIHZpZXcgfSA9IGdldE1lbW9yeSh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBjb25zdCBmaWxlRGVzY3JpcHRvciA9IHdhc2kuZmRzLmdldChmZCwgV2FzaVJpZ2h0cy5QQVRIX1JFQURMSU5LLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgbGV0IHBhdGhTdHJpbmcgPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgcGF0aCwgcGF0aCArIHBhdGhfbGVuKSk7XG4gICAgICAgICAgICBwYXRoU3RyaW5nID0gcmVzb2x2ZShmaWxlRGVzY3JpcHRvci5yZWFsUGF0aCwgcGF0aFN0cmluZyk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGZzLnJlYWRsaW5rU3luYyhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtEYXRhID0gZW5jb2Rlci5lbmNvZGUobGluayk7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsaW5rRGF0YS5sZW5ndGgsIGJ1Zl9sZW4pO1xuICAgICAgICAgICAgaWYgKGxlbiA+PSBidWZfbGVuKVxuICAgICAgICAgICAgICAgIHJldHVybiA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLztcbiAgICAgICAgICAgIEhFQVBVOC5zZXQobGlua0RhdGEuc3ViYXJyYXkoMCwgbGVuKSwgYnVmKTtcbiAgICAgICAgICAgIEhFQVBVOFtidWYgKyBsZW5dID0gMDtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfcmVhZGxpbmsoZmQsIHBhdGgsIHBhdGhfbGVuLCBidWYsIGJ1Zl9sZW4sIGJ1ZnVzZWQpIHtcbiAgICAgICAgICAgIHBhdGggPSBOdW1iZXIocGF0aCk7XG4gICAgICAgICAgICBwYXRoX2xlbiA9IE51bWJlcihwYXRoX2xlbik7XG4gICAgICAgICAgICBidWYgPSBOdW1iZXIoYnVmKTtcbiAgICAgICAgICAgIGJ1Zl9sZW4gPSBOdW1iZXIoYnVmX2xlbik7XG4gICAgICAgICAgICBidWZ1c2VkID0gTnVtYmVyKGJ1ZnVzZWQpO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDAgfHwgYnVmID09PSAwIHx8IGJ1ZnVzZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4LCB2aWV3IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9SRUFETElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkbGluayhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtEYXRhID0gZW5jb2Rlci5lbmNvZGUobGluayk7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsaW5rRGF0YS5sZW5ndGgsIGJ1Zl9sZW4pO1xuICAgICAgICAgICAgaWYgKGxlbiA+PSBidWZfbGVuKVxuICAgICAgICAgICAgICAgIHJldHVybiA0MiAvKiBXYXNpRXJybm8uRU5PQlVGUyAqLztcbiAgICAgICAgICAgIEhFQVBVOC5zZXQobGlua0RhdGEuc3ViYXJyYXkoMCwgbGVuKSwgYnVmKTtcbiAgICAgICAgICAgIEhFQVBVOFtidWYgKyBsZW5dID0gMDtcbiAgICAgICAgICAgIHZpZXcuc2V0VWludDMyKGJ1ZnVzZWQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9yZW1vdmVfZGlyZWN0b3J5JywgZnVuY3Rpb24gcGF0aF9yZW1vdmVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLnJtZGlyU3luYyhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9yZW1vdmVfZGlyZWN0b3J5KGZkLCBwYXRoLCBwYXRoX2xlbikge1xuICAgICAgICAgICAgcGF0aCA9IE51bWJlcihwYXRoKTtcbiAgICAgICAgICAgIHBhdGhfbGVuID0gTnVtYmVyKHBhdGhfbGVuKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfUkVNT1ZFX0RJUkVDVE9SWSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtZGlyKHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJ10sIFsnaTMyJ10pO1xuICAgICAgICBkZWZpbmVJbXBvcnQoJ3BhdGhfcmVuYW1lJywgZnVuY3Rpb24gcGF0aF9yZW5hbWUob2xkX2ZkLCBvbGRfcGF0aCwgb2xkX3BhdGhfbGVuLCBuZXdfZmQsIG5ld19wYXRoLCBuZXdfcGF0aF9sZW4pIHtcbiAgICAgICAgICAgIG9sZF9wYXRoID0gTnVtYmVyKG9sZF9wYXRoKTtcbiAgICAgICAgICAgIG9sZF9wYXRoX2xlbiA9IE51bWJlcihvbGRfcGF0aF9sZW4pO1xuICAgICAgICAgICAgbmV3X3BhdGggPSBOdW1iZXIobmV3X3BhdGgpO1xuICAgICAgICAgICAgbmV3X3BhdGhfbGVuID0gTnVtYmVyKG5ld19wYXRoX2xlbik7XG4gICAgICAgICAgICBpZiAob2xkX3BhdGggPT09IDAgfHwgbmV3X3BhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdhc2kgPSBfd2FzaS5nZXQodGhpcyk7XG4gICAgICAgICAgICBsZXQgb2xkV3JhcDtcbiAgICAgICAgICAgIGxldCBuZXdXcmFwO1xuICAgICAgICAgICAgaWYgKG9sZF9mZCA9PT0gbmV3X2ZkKSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSB8IFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfVEFSR0VULCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkV3JhcCA9IHdhc2kuZmRzLmdldChvbGRfZmQsIFdhc2lSaWdodHMuUEFUSF9SRU5BTUVfU09VUkNFLCBCaWdJbnQoMCkpO1xuICAgICAgICAgICAgICAgIG5ld1dyYXAgPSB3YXNpLmZkcy5nZXQobmV3X2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9sZFBhdGggPSByZXNvbHZlKG9sZFdyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBvbGRfcGF0aCwgb2xkX3BhdGggKyBvbGRfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE5ld1BhdGggPSByZXNvbHZlKG5ld1dyYXAucmVhbFBhdGgsIGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKSk7XG4gICAgICAgICAgICBjb25zdCBmcyA9IGdldEZzKHRoaXMpO1xuICAgICAgICAgICAgZnMucmVuYW1lU3luYyhyZXNvbHZlZE9sZFBhdGgsIHJlc29sdmVkTmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfcmVuYW1lKG9sZF9mZCwgb2xkX3BhdGgsIG9sZF9wYXRoX2xlbiwgbmV3X2ZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgbGV0IG9sZFdyYXA7XG4gICAgICAgICAgICBsZXQgbmV3V3JhcDtcbiAgICAgICAgICAgIGlmIChvbGRfZmQgPT09IG5ld19mZCkge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG9sZF9mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9TT1VSQ0UgfCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1RBUkdFVCwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9sZFdyYXAgPSB3YXNpLmZkcy5nZXQob2xkX2ZkLCBXYXNpUmlnaHRzLlBBVEhfUkVOQU1FX1NPVVJDRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgICAgICBuZXdXcmFwID0gd2FzaS5mZHMuZ2V0KG5ld19mZCwgV2FzaVJpZ2h0cy5QQVRIX1JFTkFNRV9UQVJHRVQsIEJpZ0ludCgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRPbGRQYXRoID0gcmVzb2x2ZShvbGRXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWROZXdQYXRoID0gcmVzb2x2ZShuZXdXcmFwLnJlYWxQYXRoLCBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgbmV3X3BhdGgsIG5ld19wYXRoICsgbmV3X3BhdGhfbGVuKSkpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShyZXNvbHZlZE9sZFBhdGgsIHJlc29sdmVkTmV3UGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIFsnaTMyJywgJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF9zeW1saW5rJywgZnVuY3Rpb24gcGF0aF9zeW1saW5rKG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIGZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIG5ld1BhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBmcy5zeW1saW5rU3luYyhvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgYXN5bmMgZnVuY3Rpb24gcGF0aF9zeW1saW5rKG9sZF9wYXRoLCBvbGRfcGF0aF9sZW4sIGZkLCBuZXdfcGF0aCwgbmV3X3BhdGhfbGVuKSB7XG4gICAgICAgICAgICBvbGRfcGF0aCA9IE51bWJlcihvbGRfcGF0aCk7XG4gICAgICAgICAgICBvbGRfcGF0aF9sZW4gPSBOdW1iZXIob2xkX3BhdGhfbGVuKTtcbiAgICAgICAgICAgIG5ld19wYXRoID0gTnVtYmVyKG5ld19wYXRoKTtcbiAgICAgICAgICAgIG5ld19wYXRoX2xlbiA9IE51bWJlcihuZXdfcGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKG9sZF9wYXRoID09PSAwIHx8IG5ld19wYXRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI4IC8qIFdhc2lFcnJuby5FSU5WQUwgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB7IEhFQVBVOCB9ID0gZ2V0TWVtb3J5KHRoaXMpO1xuICAgICAgICAgICAgY29uc3Qgd2FzaSA9IF93YXNpLmdldCh0aGlzKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEZXNjcmlwdG9yID0gd2FzaS5mZHMuZ2V0KGZkLCBXYXNpUmlnaHRzLlBBVEhfU1lNTElOSywgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBkZWNvZGVyLmRlY29kZSh1bnNoYXJlZFNsaWNlKEhFQVBVOCwgb2xkX3BhdGgsIG9sZF9wYXRoICsgb2xkX3BhdGhfbGVuKSk7XG4gICAgICAgICAgICBsZXQgbmV3UGF0aCA9IGRlY29kZXIuZGVjb2RlKHVuc2hhcmVkU2xpY2UoSEVBUFU4LCBuZXdfcGF0aCwgbmV3X3BhdGggKyBuZXdfcGF0aF9sZW4pKTtcbiAgICAgICAgICAgIG5ld1BhdGggPSByZXNvbHZlKGZpbGVEZXNjcmlwdG9yLnJlYWxQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGZzID0gZ2V0RnModGhpcyk7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5zeW1saW5rKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogV2FzaUVycm5vLkVTVUNDRVNTICovO1xuICAgICAgICB9LCBbJ2kzMicsICdpMzInLCAnaTMyJywgJ2kzMicsICdpMzInXSwgWydpMzInXSk7XG4gICAgICAgIGRlZmluZUltcG9ydCgncGF0aF91bmxpbmtfZmlsZScsIGZ1bmN0aW9uIHBhdGhfdW5saW5rX2ZpbGUoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9VTkxJTktfRklMRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aFN0cmluZyk7XG4gICAgICAgICAgICByZXR1cm4gMCAvKiBXYXNpRXJybm8uRVNVQ0NFU1MgKi87XG4gICAgICAgIH0sIGFzeW5jIGZ1bmN0aW9uIHBhdGhfdW5saW5rX2ZpbGUoZmQsIHBhdGgsIHBhdGhfbGVuKSB7XG4gICAgICAgICAgICBwYXRoID0gTnVtYmVyKHBhdGgpO1xuICAgICAgICAgICAgcGF0aF9sZW4gPSBOdW1iZXIocGF0aF9sZW4pO1xuICAgICAgICAgICAgaWYgKHBhdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMjggLyogV2FzaUVycm5vLkVJTlZBTCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgSEVBUFU4IH0gPSBnZXRNZW1vcnkodGhpcyk7XG4gICAgICAgICAgICBjb25zdCB3YXNpID0gX3dhc2kuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgY29uc3QgZmlsZURlc2NyaXB0b3IgPSB3YXNpLmZkcy5nZXQoZmQsIFdhc2lSaWdodHMuUEFUSF9VTkxJTktfRklMRSwgQmlnSW50KDApKTtcbiAgICAgICAgICAgIGxldCBwYXRoU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUodW5zaGFyZWRTbGljZShIRUFQVTgsIHBhdGgsIHBhdGggKyBwYXRoX2xlbikpO1xuICAgICAgICAgICAgcGF0aFN0cmluZyA9IHJlc29sdmUoZmlsZURlc2NyaXB0b3IucmVhbFBhdGgsIHBhdGhTdHJpbmcpO1xuICAgICAgICAgICAgY29uc3QgZnMgPSBnZXRGcyh0aGlzKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhwYXRoU3RyaW5nKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIFdhc2lFcnJuby5FU1VDQ0VTUyAqLztcbiAgICAgICAgfSwgWydpMzInLCAnaTMyJywgJ2kzMiddLCBbJ2kzMiddKTtcbiAgICAgICAgdGhpcy5fc2V0TWVtb3J5ID0gZnVuY3Rpb24gc2V0TWVtb3J5KG0pIHtcbiAgICAgICAgICAgIGlmICghKG0gaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTWVtb3J5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnlcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgV2ViQXNzZW1ibHkuTWVtb3J5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfbWVtb3J5LnNldChfdGhpcywgZXh0ZW5kTWVtb3J5KG0pKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZVN5bmMoYXJncywgZW52LCBwcmVvcGVucywgc3RkaW8sIGZzLCBwcmludCwgcHJpbnRFcnIpIHtcbiAgICAgICAgY29uc3QgZmRzID0gbmV3IFN5bmNUYWJsZSh7XG4gICAgICAgICAgICBzaXplOiAzLFxuICAgICAgICAgICAgaW46IHN0ZGlvWzBdLFxuICAgICAgICAgICAgb3V0OiBzdGRpb1sxXSxcbiAgICAgICAgICAgIGVycjogc3RkaW9bMl0sXG4gICAgICAgICAgICBmcyxcbiAgICAgICAgICAgIHByaW50LFxuICAgICAgICAgICAgcHJpbnRFcnJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IF90aGlzID0gbmV3IFdBU0kkMShhcmdzLCBlbnYsIGZkcywgZmFsc2UsIGZzKTtcbiAgICAgICAgaWYgKHByZW9wZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlb3BlbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhwcmVvcGVuc1tpXS5yZWFsUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKHJlYWxQYXRoLCAncicsIDBvNjY2KTtcbiAgICAgICAgICAgICAgICBmZHMuaW5zZXJ0UHJlb3BlbihmZCwgcHJlb3BlbnNbaV0ubWFwcGVkUGF0aCwgcmVhbFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNyZWF0ZUFzeW5jKGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBmcywgcHJpbnQsIHByaW50RXJyLCBhc3luY2lmeSkge1xuICAgICAgICBjb25zdCBmZHMgPSBuZXcgQXN5bmNUYWJsZSh7XG4gICAgICAgICAgICBzaXplOiAzLFxuICAgICAgICAgICAgaW46IHN0ZGlvWzBdLFxuICAgICAgICAgICAgb3V0OiBzdGRpb1sxXSxcbiAgICAgICAgICAgIGVycjogc3RkaW9bMl0sXG4gICAgICAgICAgICBwcmludCxcbiAgICAgICAgICAgIHByaW50RXJyXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfdGhpcyA9IG5ldyBXQVNJJDEoYXJncywgZW52LCBmZHMsIHRydWUsIGZzLCBhc3luY2lmeSk7XG4gICAgICAgIGlmIChwcmVvcGVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZW9wZW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBwcmVvcGVuc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFsUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGVudHJ5LnJlYWxQYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLnByb21pc2VzLm9wZW4ocmVhbFBhdGgsICdyJywgMG82NjYpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGZkcy5pbnNlcnRQcmVvcGVuKGZkLCBlbnRyeS5tYXBwZWRQYXRoLCByZWFsUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNwYWNlZC1jb21tZW50XG5jb25zdCBrRW1wdHlPYmplY3QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoLyojX19QVVJFX18qLyBPYmplY3QuY3JlYXRlKG51bGwpKTtcbmNvbnN0IGtFeGl0Q29kZSA9IFN5bWJvbCgna0V4aXRDb2RlJyk7XG5jb25zdCBrU2V0TWVtb3J5ID0gU3ltYm9sKCdrU2V0TWVtb3J5Jyk7XG5jb25zdCBrU3RhcnRlZCA9IFN5bWJvbCgna1N0YXJ0ZWQnKTtcbmNvbnN0IGtJbnN0YW5jZSA9IFN5bWJvbCgna0luc3RhbmNlJyk7XG5jb25zdCBrQmluZGluZ05hbWUgPSBTeW1ib2woJ2tCaW5kaW5nTmFtZScpO1xuZnVuY3Rpb24gc2V0dXBJbnN0YW5jZShzZWxmLCBpbnN0YW5jZSkge1xuICAgIHZhbGlkYXRlT2JqZWN0KGluc3RhbmNlLCAnaW5zdGFuY2UnKTtcbiAgICB2YWxpZGF0ZU9iamVjdChpbnN0YW5jZS5leHBvcnRzLCAnaW5zdGFuY2UuZXhwb3J0cycpO1xuICAgIHNlbGZba0luc3RhbmNlXSA9IGluc3RhbmNlO1xuICAgIHNlbGZba1NldE1lbW9yeV0oaW5zdGFuY2UuZXhwb3J0cy5tZW1vcnkpO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBsZXQgX1dBU0k7XG4gICAgaWYgKG9wdGlvbnMudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMudmVyc2lvbiwgJ29wdGlvbnMudmVyc2lvbicpO1xuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMudmVyc2lvbikge1xuICAgICAgICAgICAgY2FzZSAndW5zdGFibGUnOlxuICAgICAgICAgICAgICAgIF9XQVNJID0gV0FTSSQxO1xuICAgICAgICAgICAgICAgIHRoaXNba0JpbmRpbmdOYW1lXSA9ICd3YXNpX3Vuc3RhYmxlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcxJzpcbiAgICAgICAgICAgICAgICBfV0FTSSA9IFdBU0kkMTtcbiAgICAgICAgICAgICAgICB0aGlzW2tCaW5kaW5nTmFtZV0gPSAnd2FzaV9zbmFwc2hvdF9wcmV2aWV3MSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYHVuc3VwcG9ydGVkIFdBU0kgdmVyc2lvbiBcIiR7b3B0aW9ucy52ZXJzaW9ufVwiYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIF9XQVNJID0gV0FTSSQxO1xuICAgICAgICB0aGlzW2tCaW5kaW5nTmFtZV0gPSAnd2FzaV9zbmFwc2hvdF9wcmV2aWV3MSc7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFyZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZUFycmF5KG9wdGlvbnMuYXJncywgJ29wdGlvbnMuYXJncycpO1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gKChfYSA9IG9wdGlvbnMuYXJncykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pLm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IGVudiA9IFtdO1xuICAgIGlmIChvcHRpb25zLmVudiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMuZW52LCAnb3B0aW9ucy5lbnYnKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbnYpLmZvckVhY2goKHsgMDoga2V5LCAxOiB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGVudi5wdXNoKGAke2tleX09JHt2YWx1ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHByZW9wZW5zID0gW107XG4gICAgaWYgKG9wdGlvbnMucHJlb3BlbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLnByZW9wZW5zLCAnb3B0aW9ucy5wcmVvcGVucycpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLnByZW9wZW5zKS5mb3JFYWNoKCh7IDA6IGtleSwgMTogdmFsdWUgfSkgPT4gcHJlb3BlbnMucHVzaCh7IG1hcHBlZFBhdGg6IFN0cmluZyhrZXkpLCByZWFsUGF0aDogU3RyaW5nKHZhbHVlKSB9KSk7XG4gICAgfVxuICAgIGlmIChwcmVvcGVucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmZzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmlsZXN5c3RlbSBpcyBkaXNhYmxlZCwgY2FuIG5vdCBwcmVvcGVuIGRpcmVjdG9yeScpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmZzLCAnb3B0aW9ucy5mcycpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb2RlLmpzIGZzIGxpa2UgaW1wbGVtZW50YXRpb24gaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgKG9wdGlvbnMuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLmZpbGVzeXN0ZW0sICdvcHRpb25zLmZpbGVzeXN0ZW0nKVxuICAgIC8vICAgdmFsaWRhdGVTdHJpbmcob3B0aW9ucy5maWxlc3lzdGVtLnR5cGUsICdvcHRpb25zLmZpbGVzeXN0ZW0udHlwZScpXG4gICAgLy8gICBpZiAob3B0aW9ucy5maWxlc3lzdGVtLnR5cGUgIT09ICdtZW1mcycgJiYgb3B0aW9ucy5maWxlc3lzdGVtLnR5cGUgIT09ICdmaWxlLXN5c3RlbS1hY2Nlc3MtYXBpJykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGVzeXN0ZW0gdHlwZSAkeyhvcHRpb25zLmZpbGVzeXN0ZW0gYXMgYW55KS50eXBlIGFzIHN0cmluZ30gaXMgbm90IHN1cHBvcnRlZCwgb25seSBcIm1lbWZzXCIgYW5kIFwiZmlsZS1zeXN0ZW0tYWNjZXNzLWFwaVwiIGlzIHN1cHBvcnRlZCBjdXJyZW50bHlgKVxuICAgIC8vICAgfVxuICAgIC8vICAgdHJ5IHtcbiAgICAvLyAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5maWxlc3lzdGVtLmZzLCAnb3B0aW9ucy5maWxlc3lzdGVtLmZzJylcbiAgICAvLyAgIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlLmpzIGZzIGxpa2UgaW1wbGVtZW50YXRpb24gaXMgbm90IHByb3ZpZGVkJylcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgaWYgKG9wdGlvbnMucHJpbnQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zLnByaW50LCAnb3B0aW9ucy5wcmludCcpO1xuICAgIGlmIChvcHRpb25zLnByaW50RXJyICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucy5wcmludEVyciwgJ29wdGlvbnMucHJpbnRFcnInKTtcbiAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWxpZGF0ZUJvb2xlYW4ob3B0aW9ucy5yZXR1cm5PbkV4aXQsICdvcHRpb25zLnJldHVybk9uRXhpdCcpO1xuICAgIH1cbiAgICAvLyBjb25zdCB7IHN0ZGluID0gMCwgc3Rkb3V0ID0gMSwgc3RkZXJyID0gMiB9ID0gb3B0aW9uc1xuICAgIC8vIHZhbGlkYXRlSW50MzIoc3RkaW4sICdvcHRpb25zLnN0ZGluJywgMClcbiAgICAvLyB2YWxpZGF0ZUludDMyKHN0ZG91dCwgJ29wdGlvbnMuc3Rkb3V0JywgMClcbiAgICAvLyB2YWxpZGF0ZUludDMyKHN0ZGVyciwgJ29wdGlvbnMuc3RkZXJyJywgMClcbiAgICAvLyBjb25zdCBzdGRpbyA9IFtzdGRpbiwgc3Rkb3V0LCBzdGRlcnJdIGFzIGNvbnN0XG4gICAgY29uc3Qgc3RkaW8gPSBbMCwgMSwgMl07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgZW52LFxuICAgICAgICBwcmVvcGVucyxcbiAgICAgICAgc3RkaW8sXG4gICAgICAgIF9XQVNJXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGluaXRXQVNJKHNldE1lbW9yeSwgd3JhcCkge1xuICAgIHRoaXNba1NldE1lbW9yeV0gPSBzZXRNZW1vcnk7XG4gICAgdGhpcy53YXNpSW1wb3J0ID0gd3JhcDtcbiAgICB0aGlzW2tTdGFydGVkXSA9IGZhbHNlO1xuICAgIHRoaXNba0V4aXRDb2RlXSA9IDA7XG4gICAgdGhpc1trSW5zdGFuY2VdID0gdW5kZWZpbmVkO1xufVxuLyoqIEBwdWJsaWMgKi9cbmNsYXNzIFdBU0kge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSBrRW1wdHlPYmplY3QpIHtcbiAgICAgICAgY29uc3QgeyBhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgX1dBU0kgfSA9IHZhbGlkYXRlT3B0aW9ucy5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB3cmFwID0gX1dBU0kuY3JlYXRlU3luYyhhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgb3B0aW9ucy5mcywgb3B0aW9ucy5wcmludCwgb3B0aW9ucy5wcmludEVycik7XG4gICAgICAgIGNvbnN0IHNldE1lbW9yeSA9IHdyYXAuX3NldE1lbW9yeTtcbiAgICAgICAgZGVsZXRlIHdyYXAuX3NldE1lbW9yeTtcbiAgICAgICAgaW5pdFdBU0kuY2FsbCh0aGlzLCBzZXRNZW1vcnksIHdyYXApO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQpIHtcbiAgICAgICAgICAgIHdyYXAucHJvY19leGl0ID0gd2FzaVJldHVybk9uUHJvY0V4aXQuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNdXN0IG5vdCBleHBvcnQgX2luaXRpYWxpemUsIG11c3QgZXhwb3J0IF9zdGFydFxuICAgIHN0YXJ0KGluc3RhbmNlKSB7XG4gICAgICAgIGlmICh0aGlzW2tTdGFydGVkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXQVNJIGluc3RhbmNlIGhhcyBhbHJlYWR5IHN0YXJ0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzW2tTdGFydGVkXSA9IHRydWU7XG4gICAgICAgIHNldHVwSW5zdGFuY2UodGhpcywgaW5zdGFuY2UpO1xuICAgICAgICBjb25zdCB7IF9zdGFydCwgX2luaXRpYWxpemUgfSA9IHRoaXNba0luc3RhbmNlXS5leHBvcnRzO1xuICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKF9zdGFydCwgJ2luc3RhbmNlLmV4cG9ydHMuX3N0YXJ0Jyk7XG4gICAgICAgIHZhbGlkYXRlVW5kZWZpbmVkKF9pbml0aWFsaXplLCAnaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZScpO1xuICAgICAgICBsZXQgcmV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gX3N0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0LnRoZW4oKCkgPT4gdGhpc1trRXhpdENvZGVdLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVyciAhPT0ga0V4aXRDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba0V4aXRDb2RlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2tFeGl0Q29kZV07XG4gICAgfVxuICAgIC8vIE11c3Qgbm90IGV4cG9ydCBfc3RhcnQsIG1heSBvcHRpb25hbGx5IGV4cG9ydCBfaW5pdGlhbGl6ZVxuICAgIGluaXRpYWxpemUoaW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKHRoaXNba1N0YXJ0ZWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dBU0kgaW5zdGFuY2UgaGFzIGFscmVhZHkgc3RhcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNba1N0YXJ0ZWRdID0gdHJ1ZTtcbiAgICAgICAgc2V0dXBJbnN0YW5jZSh0aGlzLCBpbnN0YW5jZSk7XG4gICAgICAgIGNvbnN0IHsgX3N0YXJ0LCBfaW5pdGlhbGl6ZSB9ID0gdGhpc1trSW5zdGFuY2VdLmV4cG9ydHM7XG4gICAgICAgIHZhbGlkYXRlVW5kZWZpbmVkKF9zdGFydCwgJ2luc3RhbmNlLmV4cG9ydHMuX3N0YXJ0Jyk7XG4gICAgICAgIGlmIChfaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uKF9pbml0aWFsaXplLCAnaW5zdGFuY2UuZXhwb3J0cy5faW5pdGlhbGl6ZScpO1xuICAgICAgICAgICAgcmV0dXJuIF9pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0SW1wb3J0T2JqZWN0KCkge1xuICAgICAgICByZXR1cm4geyBbdGhpc1trQmluZGluZ05hbWVdXTogdGhpcy53YXNpSW1wb3J0IH07XG4gICAgfVxufVxuZnVuY3Rpb24gd2FzaVJldHVybk9uUHJvY0V4aXQocnZhbCkge1xuICAgIHRoaXNba0V4aXRDb2RlXSA9IHJ2YWw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aHJvdy1saXRlcmFsXG4gICAgdGhyb3cga0V4aXRDb2RlO1xufVxuLyoqIEBwdWJsaWMgKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFzeW5jV0FTSShvcHRpb25zID0ga0VtcHR5T2JqZWN0KSB7XG4gICAgY29uc3QgX3RoaXMgPSBPYmplY3QuY3JlYXRlKFdBU0kucHJvdG90eXBlKTtcbiAgICBjb25zdCB7IGFyZ3MsIGVudiwgcHJlb3BlbnMsIHN0ZGlvLCBfV0FTSSB9ID0gdmFsaWRhdGVPcHRpb25zLmNhbGwoX3RoaXMsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLmFzeW5jaWZ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucy5hc3luY2lmeSwgJ29wdGlvbnMuYXN5bmNpZnknKTtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zLmFzeW5jaWZ5LndyYXBJbXBvcnRGdW5jdGlvbiwgJ29wdGlvbnMuYXN5bmNpZnkud3JhcEltcG9ydEZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHdyYXAgPSBhd2FpdCBfV0FTSS5jcmVhdGVBc3luYyhhcmdzLCBlbnYsIHByZW9wZW5zLCBzdGRpbywgb3B0aW9ucy5mcywgb3B0aW9ucy5wcmludCwgb3B0aW9ucy5wcmludEVyciwgb3B0aW9ucy5hc3luY2lmeSk7XG4gICAgY29uc3Qgc2V0TWVtb3J5ID0gd3JhcC5fc2V0TWVtb3J5O1xuICAgIGRlbGV0ZSB3cmFwLl9zZXRNZW1vcnk7XG4gICAgaW5pdFdBU0kuY2FsbChfdGhpcywgc2V0TWVtb3J5LCB3cmFwKTtcbiAgICBpZiAob3B0aW9ucy5yZXR1cm5PbkV4aXQpIHtcbiAgICAgICAgd3JhcC5wcm9jX2V4aXQgPSB3YXNpUmV0dXJuT25Qcm9jRXhpdC5iaW5kKF90aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xufVxuXG5leHBvcnQgeyBBc3luY2lmeSwgTWVtb3J5LCBXQVNJLCBXZWJBc3NlbWJseU1lbW9yeSwgYXN5bmNpZnlMb2FkLCBhc3luY2lmeUxvYWRTeW5jLCBjcmVhdGVBc3luY1dBU0ksIGV4dGVuZE1lbW9yeSwgbG9hZCwgbG9hZFN5bmMsIHdyYXBBc3luY0V4cG9ydCwgd3JhcEFzeW5jSW1wb3J0LCB3cmFwRXhwb3J0cyB9O1xuIiwiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICovXG5jb25zdCBnZXRUeXBlID0gKHZhbHVlKSA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMFxuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAxXG4gIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWVcbiAgaWYgKHQgPT09ICdib29sZWFuJykgcmV0dXJuIDJcbiAgaWYgKHQgPT09ICdudW1iZXInKSByZXR1cm4gM1xuICBpZiAodCA9PT0gJ3N0cmluZycpIHJldHVybiA0XG4gIGlmICh0ID09PSAnb2JqZWN0JykgcmV0dXJuIDZcbiAgaWYgKHQgPT09ICdiaWdpbnQnKSByZXR1cm4gOVxuICByZXR1cm4gLTFcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnbWVtZnMnKS5JRnN9IG1lbWZzXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgZ2V0VHlwZT59IHR5cGVcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5jb25zdCBlbmNvZGVWYWx1ZSA9IChtZW1mcywgdmFsdWUsIHR5cGUpID0+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKVxuICAgIGNhc2UgMjoge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBJbnQzMkFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWUgPyAxIDogMFxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIDM6IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWVcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlcilcbiAgICB9XG4gICAgY2FzZSA0OiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxuICAgICAgcmV0dXJuIHZpZXdcbiAgICB9XG4gICAgY2FzZSA2OiB7XG4gICAgICBjb25zdCBbZW50cnldID0gT2JqZWN0LmVudHJpZXMobWVtZnMpLmZpbHRlcigoW18sIHZdKSA9PiB2ID09PSB2YWx1ZS5jb25zdHJ1Y3RvcilbMF0gPz8gW11cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsICdfX2NvbnN0cnVjdG9yX18nLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGVudHJ5XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIGBCaWdJbnQoJHtTdHJpbmcodmFsdWUpfSlgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9KVxuICAgICAgY29uc3QgdmlldyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKVxuICAgICAgcmV0dXJuIHZpZXdcbiAgICB9XG4gICAgY2FzZSA5OiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IEJpZ0ludDY0QXJyYXkoMSlcbiAgICAgIHZpZXdbMF0gPSB2YWx1ZVxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIC0xOlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRhdGEnKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJ21lbWZzJykuSUZzfSBmc1xuICogQHJldHVybnMgeyhlOiB7IGRhdGE6IHsgX19mc19fOiB7IHNhYjogSW50MzJBcnJheSwgdHlwZToga2V5b2YgaW1wb3J0KCdtZW1mcycpLklGcywgcGF5bG9hZDogYW55W10gfSB9IH0pID0+IHZvaWR9XG4gKi9cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZU9uTWVzc2FnZSA9IChmcykgPT4gZnVuY3Rpb24gb25NZXNzYWdlKGUpIHtcbiAgaWYgKGUuZGF0YS5fX2ZzX18pIHtcbiAgICAvKipcbiAgICAgKiAwLi40ICAgICAgICAgICAgICAgICAgICBzdGF0dXMoaW50MzJfdCk6ICAgICAgICAyMSh3YWl0aW5nKSAwKHN1Y2Nlc3MpIDEoZXJyb3IpXG4gICAgICogNS4uOCAgICAgICAgICAgICAgICAgICAgdHlwZShuYXBpX3ZhbHVldHlwZSk6ICAgMCh1bmRlZmluZWQpIDEobnVsbCkgMihib29sZWFuKSAzKG51bWJlcikgNChzdHJpbmcpIDYoanNvbnN0cmluZykgOShiaWdpbnQpIC0xKHVuc3VwcG9ydGVkKVxuICAgICAqIDkuLjE2ICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSh1aW50MzJfdCkgIDw9IDEwMjRcbiAgICAgKiAxNi4uMTYgKyBwYXlsb2FkX3NpemUgICBwYXlsb2FkX2NvbnRlbnRcbiAgICAgKi9cbiAgICBjb25zdCB7IHNhYiwgdHlwZSwgcGF5bG9hZCB9ID0gZS5kYXRhLl9fZnNfX1xuICAgIGNvbnN0IGZuID0gZnNbdHlwZV1cbiAgICBjb25zdCBhcmdzID0gcGF5bG9hZCA/IHBheWxvYWQubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAvLyBidWZmZXIgcG9seWZpbGwgYnVnXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgdmFsdWUuX2lzQnVmZmVyID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSkgOiBwYXlsb2FkXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuLmFwcGx5KGZzLCBhcmdzKVxuICAgICAgY29uc3QgdCA9IGdldFR5cGUocmV0KVxuICAgICAgY29uc3QgdiA9IGVuY29kZVZhbHVlKGZzLCByZXQsIHQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMCwgMClcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAxLCB0KVxuICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDIsIHYubGVuZ3RoKVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoc2FiLmJ1ZmZlcikuc2V0KHYsIDE2KVxuXG4gICAgfSBjYXRjaCAoLyoqIEB0eXBlIHthbnl9ICovIGVycikge1xuICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDAsIDEpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMSwgNilcbiAgICAgIGNvbnN0IHBheWxvYWRDb250ZW50ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgLi4uZXJyLFxuICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVyci5zdGFja1xuICAgICAgfSkpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMiwgcGF5bG9hZENvbnRlbnQubGVuZ3RoKVxuICAgICAgbmV3IFVpbnQ4QXJyYXkoc2FiLmJ1ZmZlcikuc2V0KHBheWxvYWRDb250ZW50LCAxNilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgQXRvbWljcy5ub3RpZnkoc2FiLCAwKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCdtZW1mcycpLklGc30gbWVtZnNcbiAqL1xubW9kdWxlLmV4cG9ydHMuY3JlYXRlRnNQcm94eSA9IChtZW1mcykgPT4gbmV3IFByb3h5KHt9LCB7XG4gIGdldCAoX3RhcmdldCwgcCwgX3JlY2VpdmVyKSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3Qgc2FiID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDE2ICsgMTAyNClcbiAgICAgIGNvbnN0IGkzMmFyciA9IG5ldyBJbnQzMkFycmF5KHNhYilcbiAgICAgIEF0b21pY3Muc3RvcmUoaTMyYXJyLCAwLCAyMSlcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBfX2ZzX186IHtcbiAgICAgICAgICBzYWI6IGkzMmFycixcbiAgICAgICAgICB0eXBlOiBwLFxuICAgICAgICAgIHBheWxvYWQ6IGFyZ3NcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgQXRvbWljcy53YWl0KGkzMmFyciwgMCwgMjEpXG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IEF0b21pY3MubG9hZChpMzJhcnIsIDApXG4gICAgICBjb25zdCB0eXBlID0gQXRvbWljcy5sb2FkKGkzMmFyciwgMSlcbiAgICAgIGNvbnN0IHNpemUgPSBBdG9taWNzLmxvYWQoaTMyYXJyLCAyKVxuICAgICAgY29uc3QgY29udGVudCA9IG5ldyBVaW50OEFycmF5KHNhYiwgMTYsIHNpemUpXG4gICAgICBpZiAoc3RhdHVzID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGVycm9iaiA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQuc2xpY2UoKSkpXG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihlcnJvYmoubWVzc2FnZSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ3N0YWNrJywge1xuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogZXJyb2JqLnN0YWNrXG4gICAgICAgIH0pXG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9iaikpIHtcbiAgICAgICAgICBpZiAoayA9PT0gJ21lc3NhZ2UnIHx8IGsgPT09ICdzdGFjaycpIGNvbnRpbnVlXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGVycltrXSA9IHZcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICBpZiAodHlwZSA9PT0gMSkgcmV0dXJuIG51bGxcbiAgICAgIGlmICh0eXBlID09PSAyKSByZXR1cm4gQm9vbGVhbihjb250ZW50WzBdKVxuICAgICAgaWYgKHR5cGUgPT09IDMpIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KHNhYiwgMTYsIDEpWzBdXG4gICAgICBpZiAodHlwZSA9PT0gNCkgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50LnNsaWNlKCkpXG4gICAgICBpZiAodHlwZSA9PT0gNikge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShjb250ZW50LnNsaWNlKCkpLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHZhbHVlLm1hdGNoKC9eQmlnSW50XFwoKC0/XFxkKylcXCkkLylcbiAgICAgICAgICAgIGlmIChtYXRjaGVkICYmIG1hdGNoZWRbMV0pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChtYXRjaGVkWzFdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKG9iai5fX2NvbnN0cnVjdG9yX18pIHtcbiAgICAgICAgICBjb25zdCBjdG9yID0gb2JqLl9fY29uc3RydWN0b3JfX1xuICAgICAgICAgIGRlbGV0ZSBvYmouX19jb25zdHJ1Y3Rvcl9fXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihvYmosIG1lbWZzW2N0b3JdLnByb3RvdHlwZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqXG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gOSkgcmV0dXJuIG5ldyBCaWdJbnQ2NEFycmF5KHNhYiwgMTYsIDEpWzBdXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGRhdGEnKVxuICAgIH1cbiAgfVxufSlcbiJdLCJuYW1lcyI6WyJfV2ViQXNzZW1ibHkiXSwibWFw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T0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUYsS0FBSztBQUNMLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdkIsUUFBUSxJQUFJLEdBQUcsS0FBSyxHQUFHO0FBQ3ZCLFlBQVksT0FBTztBQUNuQixRQUFRLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDbEQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO0FBQ3ZFLFNBQVM7QUFDVCxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtBQUNsRixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7QUFDdkUsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEIsS0FBSztBQUNMLENBQUM7QUFDRCxNQUFNLFVBQVUsU0FBUyxtQkFBbUIsQ0FBQztBQUM3QztBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN6QixRQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QixLQUFLO0FBQ0wsSUFBSSxNQUFNLGVBQWUsQ0FBQyxFQUFFLEVBQUU7QUFDOUIsUUFBUSxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN0RCxRQUFRLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLEtBQUs7QUFDTCxJQUFJLE1BQU0sYUFBYSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFO0FBQ2xELFFBQVEsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQywrQkFBK0I7QUFDckQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSx5QkFBeUIsQ0FBQztBQUNqSCxTQUFTO0FBQ1QsUUFBUSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3RCxRQUFRLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlGLEtBQUs7QUFDTCxJQUFJLE1BQU0sUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDN0IsUUFBUSxJQUFJLEdBQUcsS0FBSyxHQUFHO0FBQ3ZCLFlBQVksT0FBTztBQUNuQixRQUFRLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDbEQsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO0FBQ3ZFLFNBQVM7QUFDVCxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRTtBQUNsRixZQUFZLE1BQU0sSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsdUJBQXVCLENBQUM7QUFDdkUsU0FBUztBQUNULFFBQVEsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0EsTUFBTSxpQkFBaUIsaUJBQWlCLENBQUMsWUFBWSxFQUFFLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQztBQUN4RjtBQUNBLE1BQU0sTUFBTSxTQUFTLGlCQUFpQixDQUFDO0FBQ3ZDO0FBQ0EsSUFBSSxXQUFXLENBQUMsVUFBVSxFQUFFO0FBQzVCLFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFCLEtBQUs7QUFDTCxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN2RCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN6RCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN6RCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUMzRCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN6RCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUMzRCxJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUM1RCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUM5RCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUM1RCxJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsT0FBTyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUM1RCxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxNQUFNLEVBQUU7QUFDOUIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7QUFDekUsUUFBUSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyx3QkFBd0IsR0FBRztBQUNwQyxJQUFJLE1BQU0sbUJBQW1CLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQztBQUN0RCxJQUFJLElBQUksT0FBTyxtQkFBbUIsS0FBSyxVQUFVLEVBQUU7QUFDbkQsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RDtBQUNwRixZQUFZLGdFQUFnRTtBQUM1RSxZQUFZLGtFQUFrRSxDQUFDLENBQUM7QUFDaEYsS0FBSztBQUNMLElBQUksT0FBTyxtQkFBbUIsQ0FBQztBQUMvQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGVBQWUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRTtBQUN2RCxJQUFJLE1BQU0sbUJBQW1CLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztBQUMzRCxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ2pDLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2pELEtBQUs7QUFDTCxJQUFJLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLElBQUksT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNwRyxDQUFDO0FBbUJEO0FBQ0EsU0FBUyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtBQUNsQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQ2hELFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkIsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNuQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzdDLFFBQVEsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRTtBQUNsQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9ELFlBQVksTUFBTSxJQUFJLElBQUksQ0FBQztBQUMzQixZQUFZLElBQUksR0FBRyxDQUFDLENBQUM7QUFDckIsWUFBWSxPQUFPLE1BQU0sQ0FBQztBQUMxQixTQUFTO0FBQ1QsUUFBUSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEUsUUFBUSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUNoQyxRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzlCLEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUMxQixTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUU7QUFDekIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUNELFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRTtBQUNyQixJQUFJLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsSUFBSSxJQUFJLENBQUMsRUFBRTtBQUNYLFFBQVEsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQ3JELElBQUksT0FBTyxFQUFFLENBQUM7QUFDZCxDQUFDO0FBQ0QsU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFO0FBQzFCLElBQUksSUFBSSxHQUFHLFlBQVksU0FBUyxFQUFFO0FBSWxDLFFBQVEsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ3pCLEtBQUs7QUFDTCxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUk7QUFDcEIsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUUsd0JBQXdCO0FBQ3hELFFBQVEsS0FBSyxPQUFPLEVBQUUsT0FBTyxDQUFDLHVCQUF1QjtBQUNyRCxRQUFRLEtBQUssUUFBUSxFQUFFLE9BQU8sRUFBRSx3QkFBd0I7QUFDeEQsUUFBUSxLQUFLLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCO0FBQ3RELFFBQVEsS0FBSyxRQUFRLEVBQUUsT0FBTyxFQUFFLHdCQUF3QjtBQUN4RCxRQUFRLEtBQUssUUFBUSxFQUFFLE9BQU8sRUFBRSx3QkFBd0I7QUFDeEQsUUFBUSxLQUFLLFNBQVMsRUFBRSxPQUFPLEVBQUUseUJBQXlCO0FBQzFELFFBQVEsS0FBSyxRQUFRLEVBQUUsT0FBTyxFQUFFLHdCQUF3QjtBQUN4RCxRQUFRLEtBQUssUUFBUSxFQUFFLE9BQU8sQ0FBQyx3QkFBd0I7QUFDdkQsUUFBUSxLQUFLLFFBQVEsRUFBRSxPQUFPLEVBQUUsd0JBQXdCO0FBQ3hELFFBQVEsS0FBSyxXQUFXLEVBQUUsT0FBTyxFQUFFLDJCQUEyQjtBQUM5RCxRQUFRLEtBQUssUUFBUSxFQUFFLE9BQU8sRUFBRSx3QkFBd0I7QUFDeEQsS0FBSztBQUNMLElBQUksTUFBTSxHQUFHLENBQUM7QUFDZCxDQUFDO0FBQ0QsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtBQUM3QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBQ0QsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7QUFDcEMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWTtBQU94QyxRQUFRLElBQUksQ0FBQyxDQUFDO0FBQ2QsUUFBUSxJQUFJO0FBQ1osWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDekMsU0FBUztBQUNULFFBQVEsT0FBTyxHQUFHLEVBQUU7QUFDcEIsWUFBWSxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM5QixZQUFZLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLFNBQVM7QUFDVCxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNELFNBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUMxRCxJQUFJLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlELElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzNCLFFBQVEsSUFBSTtBQUNaLFlBQVksWUFBWSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDekQsU0FBUztBQUNULFFBQVEsT0FBTyxHQUFHLEVBQUU7QUFDcEIsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ2hFLGdCQUFnQixNQUFNLEdBQUcsQ0FBQztBQUMxQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFDRCxlQUFlLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNqRSxJQUFJLElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlELElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQzNCLFFBQVEsSUFBSTtBQUNaLFlBQVksWUFBWSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDcEUsU0FBUztBQUNULFFBQVEsT0FBTyxHQUFHLEVBQUU7QUFDcEIsWUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ2hFLGdCQUFnQixNQUFNLEdBQUcsQ0FBQztBQUMxQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBLE1BQU0sT0FBTyxpQkFBaUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNoRDtBQUNBLE1BQU0sT0FBTyxpQkFBaUIsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNoRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFNBQVMsU0FBUyxHQUFHO0FBQ3JCLElBQUksTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2xDLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSTtBQUN0QixRQUFRLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUNoQyxJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxRCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRCxTQUFTLHdCQUF3QixDQUFDLEtBQUssRUFBRTtBQUN6QyxJQUFJLFFBQVEsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztBQUNoRSxRQUFRLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDLENBQUM7QUFDekUsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDO0FBQ3BGLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxnQ0FBZ0M7QUFDN0UsUUFBUSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDO0FBQ3BGLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxnQ0FBZ0MsRUFBRTtBQUMvRSxDQUFDO0FBQ0QsTUFBTSxNQUFNLENBQUM7QUFDYixJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRTtBQUN2RCxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ2hGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUM5QyxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ25DLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDbEQsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BELGdCQUFnQixJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzFCLGdCQUFnQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN4RCxnQkFBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDM0MsZ0JBQWdCLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3hDLGFBQWE7QUFDYixZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLElBQUksRUFBRSxhQUFhLEVBQUU7QUFDakcsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxFQUFFO0FBQ25ELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNuQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEQsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9GLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLE9BQU8sRUFBRSxXQUFXLEVBQUU7QUFDNUYsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFlBQVksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5QyxZQUFZLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO0FBQ3BELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDakMsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUNqRCxnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUQsZ0JBQWdCLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFDN0IsZ0JBQWdCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pELGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDM0MsYUFBYTtBQUNiLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQy9GLFlBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixZQUFZLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMzQyxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUYsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRTtBQUMxRixZQUFZLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDNUMsWUFBWSxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUU7QUFDbEMsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLFFBQVEsRUFBRTtBQUN0QixnQkFBZ0IsS0FBSyxDQUFDO0FBQ3RCLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekUsb0JBQW9CLE9BQU8sQ0FBQywwQkFBMEI7QUFDdEQsZ0JBQWdCLEtBQUssQ0FBQyw2QkFBNkI7QUFDbkQsZ0JBQWdCLEtBQUssQ0FBQyxzQ0FBc0M7QUFDNUQsZ0JBQWdCLEtBQUssQ0FBQztBQUN0QixvQkFBb0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RFLG9CQUFvQixPQUFPLENBQUMsMEJBQTBCO0FBQ3RELGdCQUFnQixTQUFTLE9BQU8sRUFBRSx3QkFBd0I7QUFDMUQsYUFBYTtBQUNiLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtBQUNsRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLFFBQVEsRUFBRTtBQUN0QixnQkFBZ0IsS0FBSyxDQUFDO0FBQ3RCLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hGLG9CQUFvQixPQUFPLENBQUMsMEJBQTBCO0FBQ3RELGdCQUFnQixLQUFLLENBQUMsNkJBQTZCO0FBQ25ELGdCQUFnQixLQUFLLENBQUMsc0NBQXNDO0FBQzVELGdCQUFnQixLQUFLLENBQUMsc0NBQXNDO0FBQzVELG9CQUFvQixNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEQsb0JBQW9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsb0JBQW9CLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzFELG9CQUFvQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakcsb0JBQW9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRCxvQkFBb0IsT0FBTyxDQUFDLDBCQUEwQjtBQUN0RCxpQkFBaUI7QUFDakIsZ0JBQWdCLFNBQVMsT0FBTyxFQUFFLHdCQUF3QjtBQUMxRCxhQUFhO0FBQ2IsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsVUFBVSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0YsWUFBWSxPQUFPLEVBQUUsd0JBQXdCO0FBQzdDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRTtBQUN0RixZQUFZLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsWUFBWSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDOUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5RCxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzRSxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEYsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUU7QUFDbkcsWUFBWSxPQUFPLEVBQUUsd0JBQXdCO0FBQzdDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUU7QUFDMUgsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxZQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsVUFBVSxFQUFFO0FBQ3RGLGdCQUFnQixPQUFPLEVBQUUsNkJBQTZCO0FBQ3RELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsZ0JBQWdCO0FBQ25FLGdCQUFnQixjQUFjLENBQUMsZ0JBQWdCLEVBQUU7QUFDakQsZ0JBQWdCLE9BQU8sRUFBRSw2QkFBNkI7QUFDdEQsYUFBYTtBQUNiLFlBQVksY0FBYyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDbkQsWUFBWSxjQUFjLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDL0QsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFO0FBQ3pGLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxZQUFZLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtBQUMvQixnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksSUFBSSxjQUFjLENBQUM7QUFDL0IsWUFBWSxJQUFJO0FBQ2hCLGdCQUFnQixjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxhQUFhO0FBQ2IsWUFBWSxPQUFPLEdBQUcsRUFBRTtBQUN4QixnQkFBZ0IsSUFBSSxHQUFHLFlBQVksU0FBUztBQUM1QyxvQkFBb0IsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ3JDLGdCQUFnQixNQUFNLEdBQUcsQ0FBQztBQUMxQixhQUFhO0FBQ2IsWUFBWSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUM1QyxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0M7QUFDQSxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUYsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQzFHLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsWUFBWSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUM1QyxnQkFBZ0IsT0FBTyxDQUFDLHVCQUF1QjtBQUMvQyxZQUFZLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9ELFlBQVksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN2QyxZQUFZLElBQUksSUFBSSxHQUFHLFFBQVE7QUFDL0IsZ0JBQWdCLE9BQU8sRUFBRSx5QkFBeUI7QUFDbEQsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0FBQzdGLFlBQVksU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMxQyxZQUFZLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtBQUNqQyxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNoRCxnQkFBZ0IsT0FBTyxDQUFDLDBCQUEwQjtBQUNsRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixZQUFZLE1BQU0sQ0FBQyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFELFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFO0FBQzFFLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFlBQVksTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRCxZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekQsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFVBQVUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFO0FBQ2hILFlBQVksTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwQyxZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFlBQVksY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNwRCxZQUFZLGNBQWMsR0FBRyxjQUFjLEtBQUssQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQ3hGLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsWUFBWSxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsWUFBWSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLEdBQUcsQ0FBQztBQUNwQixZQUFZLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN4RCxZQUFZLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELGdCQUFnQixHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDdEMsZ0JBQWdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlELGdCQUFnQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxnQkFBZ0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25FLGdCQUFnQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEUsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRSxnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdELGdCQUFnQixhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDbkMsb0JBQW9CLFFBQVE7QUFDNUIsb0JBQW9CLElBQUk7QUFDeEIsb0JBQW9CLENBQUMsRUFBRTtBQUN2Qix3QkFBd0IsS0FBSyxFQUFFO0FBQy9CLDRCQUE0QixRQUFRLEVBQUUsV0FBVztBQUNqRCw0QkFBNEIsT0FBTztBQUNuQyw0QkFBNEIsU0FBUztBQUNyQyw0QkFBNEIsS0FBSztBQUNqQyx5QkFBeUI7QUFDekIsd0JBQXdCLFlBQVksRUFBRTtBQUN0Qyw0QkFBNEIsRUFBRSxFQUFFLFdBQVc7QUFDM0MseUJBQXlCO0FBQ3pCLHFCQUFxQjtBQUNyQixpQkFBaUIsQ0FBQztBQUNsQixhQUFhO0FBQ2IsWUFBWSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDaEMsWUFBWSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxnQkFBZ0IsR0FBRyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxnQkFBZ0IsUUFBUSxHQUFHLENBQUMsSUFBSTtBQUNoQyxvQkFBb0IsS0FBSyxDQUFDLDRCQUE0QjtBQUN0RCx3QkFBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxrQ0FBa0M7QUFDckY7QUFDQSw0QkFBNEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3RSw0QkFBNEIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFDcEUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw0QkFBNEIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztBQUM5RCx5QkFBeUI7QUFDekIsd0JBQXdCLElBQUksV0FBVyxLQUFLLENBQUMsSUFBSSxXQUFXLEdBQUcsV0FBVyxFQUFFO0FBQzVFLDRCQUE0QixXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ3RELDRCQUE0QixjQUFjLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUMxRCw0QkFBNEIsV0FBVyxHQUFHLENBQUMsQ0FBQztBQUM1Qyx5QkFBeUI7QUFDekIsd0JBQXdCLE1BQU07QUFDOUIscUJBQXFCO0FBQ3JCLG9CQUFvQixLQUFLLENBQUMsNkJBQTZCO0FBQ3ZELG9CQUFvQixLQUFLLENBQUM7QUFDMUIsd0JBQXdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0Msd0JBQXdCLE1BQU07QUFDOUIsb0JBQW9CLFNBQVMsT0FBTyxFQUFFLHdCQUF3QjtBQUM5RCxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFlBQVksSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNyQyxnQkFBZ0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RELG9CQUFvQixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEQsb0JBQW9CLE1BQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JFLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSx5QkFBeUIsSUFBSSxDQUFDLENBQUM7QUFDL0Usb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25FLG9CQUFvQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25FLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckQsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9ELGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELGFBQWE7QUFDYixZQUFZLElBQUksV0FBVyxFQUFFO0FBQzdCLGdCQUE4QixNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUdwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUN0QyxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9ELGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLENBQUM7QUFDNUUsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixJQUFJLENBQUMsQ0FBQztBQUM5RSxnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pELGFBQWE7QUFDYixZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsVUFBVSxJQUFJLEVBQUU7QUFJeEUsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxFQUFFO0FBQzFFLFlBQVksT0FBTyxFQUFFLHdCQUF3QjtBQUM3QyxTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxZQUFZO0FBQ3hFLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsZUFBZSxLQUFLLFVBQVU7QUFDdkcsY0FBYyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEdBQUcsRUFBRSxPQUFPLEVBQUU7QUFDdEUsZ0JBQWdCLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsZ0JBQWdCLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUMvQixvQkFBb0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNyRCxpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUMsZ0JBQWdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELGdCQUFnQixJQUFJLENBQUMsT0FBTyxpQkFBaUIsS0FBSyxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sWUFBWSxpQkFBaUI7QUFDMUcscUJBQXFCLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssNEJBQTRCLENBQUMsRUFBRTtBQUN0RyxvQkFBb0IsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDOUQsd0JBQXdCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUUscUJBQXFCO0FBQ3JCLG9CQUFvQixPQUFPLENBQUMsMEJBQTBCO0FBQ3RELGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxHQUFHLENBQUM7QUFDeEIsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNyQyxnQkFBZ0IsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLEdBQUcsT0FBTyxFQUFFLEdBQUcsSUFBSSxNQUFNLEVBQUU7QUFDckUsb0JBQW9CLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRixpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELGFBQWEsQ0FBQztBQUNkLGNBQWMsV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHLEVBQUUsT0FBTyxFQUFFO0FBQ3RFLGdCQUFnQixHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLGdCQUFnQixJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDL0Isb0JBQW9CLE9BQU8sRUFBRSx3QkFBd0I7QUFDckQsaUJBQWlCO0FBQ2pCLGdCQUFnQixPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLGdCQUFnQixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pELGdCQUFnQixLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUMxRCxvQkFBb0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sQ0FBQywwQkFBMEI7QUFDbEQsYUFBYSxDQUFDLENBQUM7QUFDZixRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWTtBQUNwRSxZQUFZLE9BQU8sRUFBRSx5QkFBeUI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWTtBQUNwRSxZQUFZLE9BQU8sRUFBRSx5QkFBeUI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWTtBQUM1RSxZQUFZLE9BQU8sRUFBRSx5QkFBeUI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsWUFBWTtBQUN4RSxZQUFZLE9BQU8sRUFBRSx5QkFBeUI7QUFDOUMsU0FBUyxDQUFDLENBQUM7QUFDWCxRQUFRLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO0FBQ3hCLFlBQVksR0FBRztBQUNmLFlBQVksSUFBSTtBQUNoQixZQUFZLEdBQUc7QUFDZixTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxFQUFFO0FBQ2QsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QjtBQUNBLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQzNCLFFBQVEsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRTtBQUMxRixZQUFZLElBQUksT0FBTyxFQUFFO0FBQ3pCLGdCQUFnQixJQUFJLFFBQVEsRUFBRTtBQUM5QixvQkFBb0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLGlCQUFpQjtBQUNqQixxQkFBcUI7QUFDckIsb0JBQW9CLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JILGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsaUJBQWlCO0FBQ2pCLGdCQUFnQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDcEUsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7QUFDMUUsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkYsWUFBWSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUMzRSxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsR0FBRyxFQUFFO0FBQzFDLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFFLGFBQWE7QUFDYixZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLFlBQVksTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztBQUN4QyxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxHQUFHLEVBQUU7QUFDMUMsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkQsYUFBYTtBQUNiLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQyxRQUFRLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxRQUFRLENBQUMsRUFBRSxFQUFFO0FBQ3ZELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxRQUFRLENBQUMsRUFBRSxFQUFFO0FBQ3ZDLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsWUFBWSxNQUFNLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDNUMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLFdBQVcsQ0FBQyxFQUFFLEVBQUU7QUFDN0QsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsV0FBVyxDQUFDLEVBQUUsRUFBRTtBQUMxQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixZQUFZLE1BQU0sY0FBYyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUMvQyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsWUFBWSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7QUFDMUUsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN6QixnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzNFLFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxlQUFlLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtBQUNuRCxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNGLFlBQVksTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztBQUN4QyxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELFlBQVksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsWUFBWSxDQUFDLHNCQUFzQixFQUFFLFNBQVMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNyRixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlELFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFO0FBQ3pELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsWUFBWSxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsU0FBUyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDM0QsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxpQ0FBaUM7QUFDakcsZ0JBQWdCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxxQ0FBcUMsQ0FBQyxpQ0FBaUM7QUFDakcsZ0JBQWdCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELGFBQWE7QUFDYixZQUFZLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ2xELFNBQVM7QUFDVCxRQUFRLFlBQVksQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNwRyxZQUFZLElBQUksd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDakQsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFILFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNoRixZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUscUJBQXFCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQ3ZFLFlBQVksSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUgsWUFBWSxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO0FBQ3hDLFlBQVksTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUM3RCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFFBQVEsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0FBQ3BGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxFQUFFO0FBQzdFLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEcsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUMsZ0JBQWdCLE9BQU8sQ0FBQywwQkFBMEI7QUFDbEQsYUFBYTtBQUNiLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFlBQVksTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDN0UsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEUsZ0JBQWdCLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDcEMsZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGFBQWEsQ0FBQyxDQUFDO0FBQ2YsWUFBWSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDMUIsWUFBWSxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU07QUFDbEMsZ0JBQWdCLElBQUk7QUFDcEIsb0JBQW9CLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzVFLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxDQUFDLEVBQUU7QUFDMUIsb0JBQW9CLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckQsaUJBQWlCO0FBQ2pCLGFBQWEsR0FBRyxDQUFDO0FBQ2pCLFlBQVksTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDcEMsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLFlBQVksS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25GLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDNUQsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxTQUFTLEVBQUU7QUFDN0UsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RyxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsT0FBTyxDQUFDLDBCQUEwQjtBQUNsRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDOUIsWUFBWSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUM3RSxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNwQyxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYSxDQUFDLENBQUM7QUFDZixZQUFZLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUMxQixZQUFZLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDcEMsWUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDekcsWUFBWSxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkYsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUMsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQsUUFBUSxZQUFZLENBQUMsV0FBVyxFQUFFLFNBQVMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDdEYsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sR0FBRyxTQUFTLEVBQUU7QUFDN0UsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RyxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsT0FBTyxDQUFDLDBCQUEwQjtBQUNsRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDMUYsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEUsZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDaEIsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pELFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtBQUNyRSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRTtBQUM3RSxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pHLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELGFBQWE7QUFDYixZQUFZLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMxRixnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNoQixZQUFZLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM3RyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6RCxRQUFRLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQzFFLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRTtBQUN2RCxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDMUIsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsT0FBTyxDQUFDLDBCQUEwQjtBQUNsRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDOUIsWUFBWSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUM3RSxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUNwQyxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYSxDQUFDLENBQUM7QUFDZixZQUFZLElBQUksTUFBTSxDQUFDO0FBQ3ZCLFlBQVksSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO0FBQzFGLG9CQUFvQixPQUFPLEVBQUUseUJBQXlCO0FBQ3RELGlCQUFpQjtBQUNqQixnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO0FBQ3JDLGdCQUFnQixLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hFLGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sR0FBRyxDQUFDLE1BQU07QUFDaEMsb0JBQW9CLElBQUk7QUFDeEIsd0JBQXdCLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLHFCQUFxQjtBQUNyQixvQkFBb0IsT0FBTyxDQUFDLEVBQUU7QUFDOUIsd0JBQXdCLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQscUJBQXFCO0FBQ3JCLGlCQUFpQixHQUFHLENBQUM7QUFDckIsZ0JBQWdCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLGdCQUFnQixNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZILGdCQUFnQixLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkYsZ0JBQWdCLGNBQWMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzRCxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDdkQsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzFCLGdCQUFnQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUMsZ0JBQWdCLE9BQU8sQ0FBQywwQkFBMEI7QUFDbEQsYUFBYTtBQUNiLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFlBQVksTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDN0UsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsZ0JBQWdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEUsZ0JBQWdCLFNBQVMsSUFBSSxNQUFNLENBQUM7QUFDcEMsZ0JBQWdCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzFELGFBQWEsQ0FBQyxDQUFDO0FBQ2YsWUFBWSxJQUFJLE1BQU0sQ0FBQztBQUN2QixZQUFZLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUMxQixZQUFZLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtBQUMxRixvQkFBb0IsT0FBTyxFQUFFLHlCQUF5QjtBQUN0RCxpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUNyQyxnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRSxhQUFhO0FBQ2IsaUJBQWlCO0FBQ2pCLGdCQUFnQixNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkQsZ0JBQWdCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3hDLGdCQUFnQixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pILGdCQUFnQixLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkYsZ0JBQWdCLGNBQWMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFFBQVEsWUFBWSxDQUFDLFlBQVksRUFBRSxTQUFTLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQzFGLFlBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFlBQVksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQzFDLGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDN0YsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQUMvQixZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xFLGdCQUFnQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRSxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuSCxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzRSxnQkFBZ0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pFLGdCQUFnQixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9ELGdCQUFnQixTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNGLGdCQUFnQixTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25FLGdCQUFnQixJQUFJLElBQUksQ0FBQztBQUN6QixnQkFBZ0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDekMsb0JBQW9CLElBQUksR0FBRyxDQUFDLGlDQUFpQztBQUM3RCxpQkFBaUI7QUFDakIscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFO0FBQ25ELG9CQUFvQixJQUFJLEdBQUcsQ0FBQyw4QkFBOEI7QUFDMUQsaUJBQWlCO0FBQ2pCLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtBQUN0RCxvQkFBb0IsSUFBSSxHQUFHLENBQUMsa0NBQWtDO0FBQzlELGlCQUFpQjtBQUNqQixxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtBQUN6RCxvQkFBb0IsSUFBSSxHQUFHLENBQUMscUNBQXFDO0FBQ2pFLGlCQUFpQjtBQUNqQixxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7QUFDckQsb0JBQW9CLElBQUksR0FBRyxDQUFDLGlDQUFpQztBQUM3RCxpQkFBaUI7QUFDakIscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO0FBQ2hELG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxrQ0FBa0M7QUFDOUQsaUJBQWlCO0FBQ2pCLHFCQUFxQjtBQUNyQixvQkFBb0IsSUFBSSxHQUFHLENBQUMsNEJBQTRCO0FBQ3hELGlCQUFpQjtBQUNqQixnQkFBZ0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLGdCQUFnQixNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDbEcsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQztBQUNuRCxnQkFBZ0IsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDOUMsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RELFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxVQUFVLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtBQUN4RSxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUIsWUFBWSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxZQUFZLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUMxQyxnQkFBZ0IsT0FBTyxDQUFDLDBCQUEwQjtBQUNsRCxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3hHLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsWUFBWSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDL0IsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRSxnQkFBZ0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUgsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDM0UsZ0JBQWdCLE1BQU0sU0FBUyxHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRSxnQkFBZ0IsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvRCxnQkFBZ0IsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzRixnQkFBZ0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUM7QUFDekIsZ0JBQWdCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO0FBQ3pDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxpQ0FBaUM7QUFDN0QsaUJBQWlCO0FBQ2pCLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtBQUNuRCxvQkFBb0IsSUFBSSxHQUFHLENBQUMsOEJBQThCO0FBQzFELGlCQUFpQjtBQUNqQixxQkFBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUU7QUFDdEQsb0JBQW9CLElBQUksR0FBRyxDQUFDLGtDQUFrQztBQUM5RCxpQkFBaUI7QUFDakIscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEVBQUU7QUFDekQsb0JBQW9CLElBQUksR0FBRyxDQUFDLHFDQUFxQztBQUNqRSxpQkFBaUI7QUFDakIscUJBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO0FBQ3JELG9CQUFvQixJQUFJLEdBQUcsQ0FBQyxpQ0FBaUM7QUFDN0QsaUJBQWlCO0FBQ2pCLHFCQUFxQixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtBQUNoRCxvQkFBb0IsSUFBSSxHQUFHLENBQUMsa0NBQWtDO0FBQzlELGlCQUFpQjtBQUNqQixxQkFBcUI7QUFDckIsb0JBQW9CLElBQUksR0FBRyxDQUFDLDRCQUE0QjtBQUN4RCxpQkFBaUI7QUFDakIsZ0JBQWdCLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLGdCQUFnQixTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1QyxnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDbkQsZ0JBQWdCLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzlDLGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0RCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6RCxRQUFRLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNuRSxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEMsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxlQUFlLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO0FBQ2hELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLE9BQU8sQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsT0FBTyxDQUFDLEVBQUUsRUFBRTtBQUN0QyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRixZQUFZLE1BQU0sY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMzQyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsWUFBWSxDQUFDLFVBQVUsRUFBRSxTQUFTLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDNUUsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3ZELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELGFBQWE7QUFDYixZQUFZLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMxRixnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNoQixZQUFZLElBQUksUUFBUSxDQUFDO0FBQ3pCLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDdEMsZ0JBQWdCLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxnQkFBZ0IsUUFBUSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pILGdCQUFnQixjQUFjLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakQsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxlQUFlLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDNUQsWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3ZELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMxQixnQkFBZ0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLGdCQUFnQixPQUFPLENBQUMsMEJBQTBCO0FBQ2xELGFBQWE7QUFDYixZQUFZLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUMxRixnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDMUQsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUNoQixZQUFZLElBQUksUUFBUSxDQUFDO0FBQ3pCLFlBQVksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDdEMsZ0JBQWdCLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDO0FBQ3RJLGdCQUFnQixjQUFjLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakQsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsRCxRQUFRLFlBQVksQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ2pHLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckMsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxlQUFlLHFCQUFxQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3BFLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEQsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsWUFBWSxDQUFDLG1CQUFtQixFQUFFLFNBQVMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUMxRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQzlDLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsWUFBWSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzFGLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksVUFBVSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3RFLFlBQVksSUFBSSxJQUFJLENBQUM7QUFDckIsWUFBWSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDbkMsZ0JBQWdCLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLGFBQWE7QUFDYixZQUFZLFVBQVUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO0FBQ2pGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDOUMsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDMUYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdEUsWUFBWSxJQUFJLElBQUksQ0FBQztBQUNyQixZQUFZLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuQyxnQkFBZ0IsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDNUUsYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDN0UsYUFBYTtBQUNiLFlBQVksVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQsUUFBUSxZQUFZLENBQUMseUJBQXlCLEVBQUUsU0FBUyx1QkFBdUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDbkksWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLElBQUksSUFBSSxLQUFLLENBQUM7QUFDMUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkcsWUFBWSxJQUFJLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxFQUFFO0FBQ3JELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUksWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ3JHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUNwRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ3JHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUNwRCxhQUFhO0FBQ2IsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEUsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxlQUFlLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUNwRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQztBQUMxQixnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRyxZQUFZLElBQUksd0JBQXdCLENBQUMsU0FBUyxDQUFDLEVBQUU7QUFDckQsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxZQUFZLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakosWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ3JHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUNwRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMscUNBQXFDLENBQUMsaUNBQWlDO0FBQ3JHLGdCQUFnQixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUNwRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0UsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2RSxRQUFRLFlBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQ2hJLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoRCxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxJQUFJLE9BQU8sQ0FBQztBQUN4QixZQUFZLElBQUksT0FBTyxDQUFDO0FBQ3hCLFlBQVksSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ25DLGdCQUFnQixPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ILGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN0SixZQUFZLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4SSxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzFELFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxTQUFTLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQy9HLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoRCxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxJQUFJLE9BQU8sQ0FBQztBQUN4QixZQUFZLElBQUksT0FBTyxDQUFDO0FBQ3hCLFlBQVksSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ25DLGdCQUFnQixPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ILGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxlQUFlLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDN0osWUFBWSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEksWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNyRSxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLFFBQVEsU0FBUyxRQUFRLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUU7QUFDbkYsWUFBWSxNQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsSUFBSSxVQUFVLENBQUMsT0FBTztBQUM5RCxnQkFBZ0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxZQUFZLE1BQU0sS0FBSyxHQUFHLENBQUMsY0FBYyxJQUFJLFVBQVUsQ0FBQyxXQUFXO0FBQ25FLGdCQUFnQixVQUFVLENBQUMsUUFBUTtBQUNuQyxnQkFBZ0IsVUFBVSxDQUFDLFdBQVc7QUFDdEMsZ0JBQWdCLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRSxZQUFZLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxrQ0FBa0MsQ0FBQyxnQ0FBZ0M7QUFDNUksWUFBWSxJQUFJLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO0FBQ25ELFlBQVksSUFBSSxpQkFBaUIsR0FBRyxjQUFjLEdBQUcsb0JBQW9CLENBQUM7QUFDMUUsWUFBWSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsd0NBQXdDLENBQUMsRUFBRTtBQUN2RSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUUsK0JBQStCO0FBQzFELGdCQUFnQixXQUFXLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDO0FBQzNELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxFQUFFO0FBQzNFLGdCQUFnQixLQUFLLElBQUksS0FBSyxtQ0FBbUM7QUFDakUsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLHVDQUF1QyxDQUFDLEVBQUU7QUFDdEUsZ0JBQWdCLEtBQUssSUFBSSxHQUFHLDhCQUE4QjtBQUMxRCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsd0NBQXdDLENBQUMsRUFBRTtBQUN2RSxnQkFBZ0IsS0FBSyxJQUFJLEdBQUcsK0JBQStCO0FBQzNELGdCQUFnQixXQUFXLElBQUksVUFBVSxDQUFDLHNCQUFzQixDQUFDO0FBQ2pFLGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFO0FBQzlELGdCQUFnQixLQUFLLElBQUksSUFBSSxnQ0FBZ0M7QUFDN0QsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLDZCQUE2QixDQUFDLEVBQUU7QUFDN0Q7QUFDQSxnQkFBZ0IsaUJBQWlCLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQztBQUM1RCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsZ0NBQWdDLENBQUMsRUFBRTtBQUNoRSxnQkFBZ0IsS0FBSyxJQUFJLElBQUksa0NBQWtDO0FBQy9ELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFO0FBQzdELGdCQUFnQixLQUFLLElBQUksT0FBTyw4QkFBOEI7QUFDOUQsZ0JBQWdCLGlCQUFpQixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7QUFDeEQsYUFBYTtBQUNiLFlBQVksSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLDRCQUE0QixDQUFDLEVBQUU7QUFDN0QsZ0JBQWdCLEtBQUssSUFBSSxPQUFPLDhCQUE4QjtBQUM5RCxnQkFBZ0IsaUJBQWlCLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQztBQUN4RCxhQUFhO0FBQ2IsWUFBWSxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLGtDQUFrQyxHQUFHLCtCQUErQixNQUFNLENBQUMsRUFBRTtBQUNwSCxnQkFBZ0IsaUJBQWlCLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQztBQUN4RCxhQUFhO0FBQ2IsWUFBWSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0FBQzdELFNBQVM7QUFDVCxRQUFRLFlBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtBQUNuSixZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzVCLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7QUFDeEMsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsWUFBWSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNoRSxZQUFZLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4SyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDckYsWUFBWSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsWUFBWSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3pDLFlBQVksTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM1RixZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RixZQUFZLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNsRSxZQUFZLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLDRDQUE0QyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsK0JBQStCO0FBQzFILGdCQUFnQixPQUFPLEVBQUUseUJBQXlCO0FBQ2xELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwSCxZQUFZLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxjQUFjLEdBQUcsUUFBUSxFQUFFLG9CQUFvQixHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6SixZQUFZLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDM0QsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUMvQixnQkFBZ0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscUNBQXFDLENBQUMsRUFBRTtBQUM1RSxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7QUFDbEksWUFBWSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QixZQUFZLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO0FBQ3hDLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3BELFlBQVksb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDaEUsWUFBWSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEssWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3JGLFlBQVksTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDLFlBQVksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUN6QyxZQUFZLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUYsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLGFBQWEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25HLFlBQVksTUFBTSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdFLFlBQVksTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLCtCQUErQjtBQUMxSCxnQkFBZ0IsT0FBTyxFQUFFLHlCQUF5QjtBQUNsRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZILFlBQVksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsR0FBRyxRQUFRLEVBQUUsb0JBQW9CLEdBQUcsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pKLFlBQVksTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEQsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUMvQixnQkFBZ0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscUNBQXFDLENBQUMsRUFBRTtBQUM1RSxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsWUFBWSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckYsUUFBUSxZQUFZLENBQUMsZUFBZSxFQUFFLFNBQVMsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3hHLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQzFELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xELFlBQVksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxHQUFHLElBQUksT0FBTztBQUM5QixnQkFBZ0IsT0FBTyxFQUFFLHlCQUF5QjtBQUNsRCxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkQsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ25GLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLFlBQVksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0QyxZQUFZLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQzFELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JELFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEUsWUFBWSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xELFlBQVksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxHQUFHLElBQUksT0FBTztBQUM5QixnQkFBZ0IsT0FBTyxFQUFFLHlCQUF5QjtBQUNsRCxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDdkQsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEUsUUFBUSxZQUFZLENBQUMsdUJBQXVCLEVBQUUsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNqRyxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQzVCLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxZQUFZLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDMUYsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdEUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3JDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwRSxZQUFZLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQzVCLGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxZQUFZLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDMUYsWUFBWSxVQUFVLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdEUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2hELFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQyxRQUFRLFlBQVksQ0FBQyxhQUFhLEVBQUUsU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7QUFDekgsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoRCxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hELFlBQVksSUFBSSxRQUFRLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUU7QUFDbEQsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLElBQUksT0FBTyxDQUFDO0FBQ3hCLFlBQVksSUFBSSxPQUFPLENBQUM7QUFDeEIsWUFBWSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7QUFDbkMsZ0JBQWdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkksYUFBYTtBQUNiLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekYsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsWUFBWSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEksWUFBWSxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEksWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUM1RCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLGVBQWUsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQ3RHLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoRCxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxJQUFJLE9BQU8sQ0FBQztBQUN4QixZQUFZLElBQUksT0FBTyxDQUFDO0FBQ3hCLFlBQVksSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO0FBQ25DLGdCQUFnQixPQUFPLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25JLGFBQWE7QUFDYixpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RixhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hJLFlBQVksTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hJLFlBQVksTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDdkUsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLFFBQVEsWUFBWSxDQUFDLGNBQWMsRUFBRSxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0FBQy9HLFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoRCxZQUFZLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO0FBQ2xELGdCQUFnQixPQUFPLEVBQUUsd0JBQXdCO0FBQ2pELGFBQWE7QUFDYixZQUFZLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEYsWUFBWSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3JHLFlBQVksSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNuRyxZQUFZLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLFlBQVksT0FBTyxDQUFDLDBCQUEwQjtBQUM5QyxTQUFTLEVBQUUsZUFBZSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtBQUMzRixZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hELFlBQVksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN4QyxZQUFZLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsWUFBWSxJQUFJLFFBQVEsS0FBSyxDQUFDLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtBQUNsRCxnQkFBZ0IsT0FBTyxFQUFFLHdCQUF3QjtBQUNqRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFlBQVksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLFlBQVksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNyRyxZQUFZLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDbkcsWUFBWSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEUsWUFBWSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxZQUFZLE9BQU8sQ0FBQywwQkFBMEI7QUFDOUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6RCxRQUFRLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3ZGLFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVGLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEMsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxlQUFlLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQy9ELFlBQVksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxZQUFZLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsWUFBWSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDNUIsZ0JBQWdCLE9BQU8sRUFBRSx3QkFBd0I7QUFDakQsYUFBYTtBQUNiLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxZQUFZLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVGLFlBQVksSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakQsWUFBWSxPQUFPLENBQUMsMEJBQTBCO0FBQzlDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDaEQsWUFBWSxJQUFJLEVBQUUsQ0FBQyxZQUFZLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNyRCxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0FBQ3ZHLGFBQWE7QUFDYixZQUFZLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTCxJQUFJLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtBQUN2RSxRQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxDQUFDO0FBQ2xDLFlBQVksSUFBSSxFQUFFLENBQUM7QUFDbkIsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixZQUFZLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFlBQVksR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekIsWUFBWSxFQUFFO0FBQ2QsWUFBWSxLQUFLO0FBQ2pCLFlBQVksUUFBUTtBQUNwQixTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVELFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3RELGdCQUFnQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0UsZ0JBQWdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3RCxnQkFBZ0IsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4RSxhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksYUFBYSxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTtBQUN4RixRQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksVUFBVSxDQUFDO0FBQ25DLFlBQVksSUFBSSxFQUFFLENBQUM7QUFDbkIsWUFBWSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QixZQUFZLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLFlBQVksR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekIsWUFBWSxLQUFLO0FBQ2pCLFlBQVksUUFBUTtBQUNwQixTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyRSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDakMsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtBQUN0RCxnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLGdCQUFnQixNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1RSxnQkFBZ0IsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLGdCQUFnQixNQUFNLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEUsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sWUFBWSxpQkFBaUIsTUFBTSxDQUFDLE1BQU0sZUFBZSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM1QyxTQUFTLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3ZDLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN6QyxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDekQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUNELFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRTtBQUNsQyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQ1gsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLElBQUksSUFBSSxLQUFLLENBQUM7QUFDZCxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDdkMsUUFBUSxjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNELFFBQVEsUUFBUSxPQUFPLENBQUMsT0FBTztBQUMvQixZQUFZLEtBQUssVUFBVTtBQUMzQixnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMvQixnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLGVBQWUsQ0FBQztBQUNyRCxnQkFBZ0IsTUFBTTtBQUN0QixZQUFZLEtBQUssVUFBVTtBQUMzQixnQkFBZ0IsS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUMvQixnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLHdCQUF3QixDQUFDO0FBQzlELGdCQUFnQixNQUFNO0FBQ3RCLFlBQVk7QUFDWixnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRixTQUFTO0FBQ1QsS0FBSztBQUNMLFNBQVM7QUFDVCxRQUFRLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDdkIsUUFBUSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsd0JBQXdCLENBQUM7QUFDdEQsS0FBSztBQUNMLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNwQyxRQUFRLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3BELEtBQUs7QUFDTCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxLQUFLLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZGLElBQUksTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ25CLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSztBQUN0RSxZQUFZLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUNyQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsYUFBYTtBQUNiLFNBQVMsQ0FBQyxDQUFDO0FBQ1gsS0FBSztBQUNMLElBQUksTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUN4QyxRQUFRLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDN0QsUUFBUSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEosS0FBSztBQUNMLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUM3QixRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDdEMsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7QUFDakYsU0FBUztBQUNULFFBQVEsSUFBSTtBQUNaLFlBQVksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckQsU0FBUztBQUNULFFBQVEsT0FBTyxDQUFDLEVBQUU7QUFDbEIsWUFBWSxNQUFNLElBQUksU0FBUyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7QUFDbEYsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO0FBQ25DLFFBQVEsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN6RCxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO0FBQ3RDLFFBQVEsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQy9ELElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtBQUM1QyxRQUFRLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDdEUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJLE9BQU87QUFDWCxRQUFRLElBQUk7QUFDWixRQUFRLEdBQUc7QUFDWCxRQUFRLFFBQVE7QUFDaEIsUUFBUSxLQUFLO0FBQ2IsUUFBUSxLQUFLO0FBQ2IsS0FBSyxDQUFDO0FBQ04sQ0FBQztBQUNELFNBQVMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUU7QUFDbkMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0EsTUFBTSxJQUFJLENBQUM7QUFDWCxJQUFJLFdBQVcsQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFO0FBQ3hDLFFBQVEsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRixRQUFRLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0csUUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzFDLFFBQVEsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQy9CLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO0FBQ2xDLFlBQVksSUFBSSxDQUFDLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0QsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtBQUNwQixRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzVCLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBQ2pFLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsUUFBUSxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ2hFLFFBQVEsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDNUQsUUFBUSxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsOEJBQThCLENBQUMsQ0FBQztBQUN2RSxRQUFRLElBQUksR0FBRyxDQUFDO0FBQ2hCLFFBQVEsSUFBSTtBQUNaLFlBQVksR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQzNCLFNBQVM7QUFDVCxRQUFRLE9BQU8sR0FBRyxFQUFFO0FBQ3BCLFlBQVksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQ25DLGdCQUFnQixNQUFNLEdBQUcsQ0FBQztBQUMxQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFO0FBQ3BDLFlBQVksT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLO0FBQzVELGdCQUFnQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7QUFDdkMsb0JBQW9CLE1BQU0sR0FBRyxDQUFDO0FBQzlCLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdkMsYUFBYSxDQUFDLENBQUM7QUFDZixTQUFTO0FBQ1QsUUFBUSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7QUFDekIsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUM1QixZQUFZLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztBQUNqRSxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQVEsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0QyxRQUFRLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNoRSxRQUFRLGlCQUFpQixDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQzdELFFBQVEsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLFlBQVksZ0JBQWdCLENBQUMsV0FBVyxFQUFFLDhCQUE4QixDQUFDLENBQUM7QUFDMUUsWUFBWSxPQUFPLFdBQVcsRUFBRSxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxlQUFlLEdBQUc7QUFDdEIsUUFBUSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3pELEtBQUs7QUFDTCxDQUFDO0FBQ0QsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUU7QUFDcEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzNCO0FBQ0EsSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNwQjs7QUM5cEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQUssS0FBSztBQUMzQixFQUFFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUM7QUFDbkMsRUFBRSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQzlCLEVBQUUsTUFBTSxDQUFDLEdBQUcsT0FBTyxNQUFLO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLE9BQU8sQ0FBQztBQUMvQixFQUFFLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLENBQUM7QUFDOUIsRUFBRSxJQUFJLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBTyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFLE9BQU8sQ0FBQztBQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLENBQUM7QUFDOUIsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNYLEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUs7QUFDNUMsRUFBRSxRQUFRLElBQUk7QUFDZCxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ1gsSUFBSSxLQUFLLENBQUM7QUFDVixNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQzlCLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDWixNQUFNLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsRUFBQztBQUNwQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUM7QUFDN0IsTUFBTSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDeEMsS0FBSztBQUNMLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDWixNQUFNLE1BQU0sSUFBSSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsRUFBQztBQUN0QyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFLO0FBQ3JCLE1BQU0sT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3hDLEtBQUs7QUFDTCxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ1osTUFBTSxNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUM7QUFDbEQsTUFBTSxPQUFPLElBQUk7QUFDakIsS0FBSztBQUNMLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDWixNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRTtBQUNoRyxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ2pCLFFBQVEsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7QUFDeEQsVUFBVSxZQUFZLEVBQUUsSUFBSTtBQUM1QixVQUFVLFFBQVEsRUFBRSxJQUFJO0FBQ3hCLFVBQVUsVUFBVSxFQUFFLElBQUk7QUFDMUIsVUFBVSxLQUFLLEVBQUUsS0FBSztBQUN0QixTQUFTLEVBQUM7QUFDVixPQUFPO0FBQ1A7QUFDQSxNQUFNLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssS0FBSztBQUN2RCxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLFVBQVUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFNBQVM7QUFDVCxRQUFRLE9BQU8sS0FBSztBQUNwQixPQUFPLEVBQUM7QUFDUixNQUFNLE1BQU0sSUFBSSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBQztBQUNqRCxNQUFNLE9BQU8sSUFBSTtBQUNqQixLQUFLO0FBQ0wsSUFBSSxLQUFLLENBQUMsRUFBRTtBQUNaLE1BQU0sTUFBTSxJQUFJLEdBQUcsSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFDO0FBQ3ZDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQUs7QUFDckIsTUFBTSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDeEMsS0FBSztBQUNMLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNaLElBQUk7QUFDSixNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUM7QUFDekMsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzhCLElBQUEsZUFBQSxHQUFHLENBQUMsRUFBRSxLQUFLLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRTtBQUMvRCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU07QUFDaEQsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFDO0FBQ3ZCLElBQUksTUFBTSxJQUFJLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUs7QUFDbEQsTUFBTSxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7QUFDdkM7QUFDQTtBQUNBLFFBQVEsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFJO0FBQzlCLE9BQU87QUFDUCxNQUFNLE9BQU8sS0FBSztBQUNsQixLQUFLLENBQUMsR0FBRyxRQUFPO0FBQ2hCLElBQUksSUFBSTtBQUNSLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFDO0FBQ3BDLE1BQU0sTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBQztBQUM1QixNQUFNLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBQztBQUN2QyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUM7QUFDOUIsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQzlCLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUM7QUFDckMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUM7QUFDM0M7QUFDQSxLQUFLLENBQUMsMEJBQTBCLEdBQUcsRUFBRTtBQUNyQyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUM7QUFDOUIsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDO0FBQzlCLE1BQU0sTUFBTSxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUNyRSxRQUFRLEdBQUcsR0FBRztBQUNkLFFBQVEsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0FBQzVCLFFBQVEsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO0FBQ3hCLE9BQU8sQ0FBQyxFQUFDO0FBQ1QsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBQztBQUNsRCxNQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsRUFBQztBQUN4RCxLQUFLLFNBQVM7QUFDZCxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBQztBQUM1QixLQUFLO0FBQ0wsR0FBRztBQUNILEVBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUM0QixJQUFBLGFBQUEsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUU7QUFDeEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sVUFBVSxHQUFHLElBQUksRUFBRTtBQUM5QixNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQWlCLENBQUMsRUFBRSxHQUFHLElBQUksRUFBQztBQUNsRCxNQUFNLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBQztBQUN4QyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUM7QUFDbEM7QUFDQTtBQUNBLE1BQU0sV0FBVyxDQUFDO0FBQ2xCLFFBQVEsTUFBTSxFQUFFO0FBQ2hCLFVBQVUsR0FBRyxFQUFFLE1BQU07QUFDckIsVUFBVSxJQUFJLEVBQUUsQ0FBQztBQUNqQixVQUFVLE9BQU8sRUFBRSxJQUFJO0FBQ3ZCLFNBQVM7QUFDVCxPQUFPLEVBQUM7QUFDUjtBQUNBLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQztBQUNqQztBQUNBLE1BQU0sTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDO0FBQzVDLE1BQU0sTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDO0FBQzFDLE1BQU0sTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDO0FBQzFDLE1BQU0sTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUM7QUFDbkQsTUFBTSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDeEIsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDO0FBQzVFLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBQztBQUM3QyxRQUFRLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRTtBQUM1QyxVQUFVLFlBQVksRUFBRSxJQUFJO0FBQzVCLFVBQVUsVUFBVSxFQUFFLEtBQUs7QUFDM0IsVUFBVSxRQUFRLEVBQUUsSUFBSTtBQUN4QixVQUFVLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztBQUM3QixTQUFTLEVBQUM7QUFDVixRQUFRLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQ3JELFVBQVUsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxPQUFPLEVBQUUsUUFBUTtBQUN4RDtBQUNBLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7QUFDcEIsU0FBUztBQUNULFFBQVEsTUFBTSxHQUFHO0FBQ2pCLE9BQU87QUFDUCxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVM7QUFDdEMsTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJO0FBQ2pDLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RFLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEtBQUs7QUFDM0YsVUFBVSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUN6QyxZQUFZLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUM7QUFDOUQsWUFBWSxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdkMsY0FBYyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsYUFBYTtBQUNiLFdBQVc7QUFDWCxVQUFVLE9BQU8sS0FBSztBQUN0QixTQUFTLEVBQUM7QUFDVixRQUFRLElBQUksR0FBRyxDQUFDLGVBQWUsRUFBRTtBQUNqQyxVQUFVLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxnQkFBZTtBQUMxQyxVQUFVLE9BQU8sR0FBRyxDQUFDLGdCQUFlO0FBQ3BDO0FBQ0EsVUFBVSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFDO0FBQzNELFNBQVM7QUFDVCxRQUFRLE9BQU8sR0FBRztBQUNsQixPQUFPO0FBQ1AsTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUM7QUFDekMsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDOzs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzXX0= diff --git a/tsconfig.build.json b/tsconfig.build.json index 3d5590e..966e0cb 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -4,5 +4,5 @@ }, "extends": "./tsconfig.json", "include": ["./src/**/*"], - "exclude": ["**/*.spec.ts", "src/lib/runtime.js"] + "exclude": ["**/*.spec.ts"] }