var _WebAssembly$2 = typeof WebAssembly !== 'undefined' ? WebAssembly : typeof WXWebAssembly !== 'undefined' ? WXWebAssembly : undefined; var ENVIRONMENT_IS_NODE = null !== null; function getPostMessage(options) { return typeof (options === null || options === void 0 ? void 0 : options.postMessage) === 'function' ? options.postMessage : typeof postMessage === 'function' ? postMessage : undefined; } function serizeErrorToBuffer(sab, code, error) { var i32array = new Int32Array(sab); Atomics.store(i32array, 0, code); if (code > 1 && error) { var name_1 = error.name; var message = error.message; var stack = error.stack; var nameBuffer = new TextEncoder().encode(name_1); var messageBuffer = new TextEncoder().encode(message); var stackBuffer = new TextEncoder().encode(stack); Atomics.store(i32array, 1, nameBuffer.length); Atomics.store(i32array, 2, messageBuffer.length); Atomics.store(i32array, 3, stackBuffer.length); var buffer = new Uint8Array(sab); buffer.set(nameBuffer, 16); buffer.set(messageBuffer, 16 + nameBuffer.length); buffer.set(stackBuffer, 16 + nameBuffer.length + messageBuffer.length); } } function deserizeErrorFromBuffer(sab) { var _a, _b; var i32array = new Int32Array(sab); var status = Atomics.load(i32array, 0); if (status <= 1) { return null; } var nameLength = Atomics.load(i32array, 1); var messageLength = Atomics.load(i32array, 2); var stackLength = Atomics.load(i32array, 3); var buffer = new Uint8Array(sab); var nameBuffer = buffer.slice(16, 16 + nameLength); var messageBuffer = buffer.slice(16 + nameLength, 16 + nameLength + messageLength); var stackBuffer = buffer.slice(16 + nameLength + messageLength, 16 + nameLength + messageLength + stackLength); var name = new TextDecoder().decode(nameBuffer); var message = new TextDecoder().decode(messageBuffer); var stack = new TextDecoder().decode(stackBuffer); var ErrorConstructor = (_a = globalThis[name]) !== null && _a !== void 0 ? _a : (name === 'RuntimeError' ? ((_b = _WebAssembly$2.RuntimeError) !== null && _b !== void 0 ? _b : Error) : Error); var error = new ErrorConstructor(message); Object.defineProperty(error, 'stack', { value: stack, writable: true, enumerable: false, configurable: true }); return error; } /** @public */ function isSharedArrayBuffer(value) { return ((typeof SharedArrayBuffer === 'function' && value instanceof SharedArrayBuffer) || (Object.prototype.toString.call(value) === '[object SharedArrayBuffer]')); } /** @public */ function isTrapError(e) { try { return e instanceof _WebAssembly$2.RuntimeError; } catch (_) { return false; } } function createMessage(type, payload) { return { __emnapi__: { type: type, payload: payload } }; } var WASI_THREADS_MAX_TID = 0x1FFFFFFF; function checkSharedWasmMemory(wasmMemory) { if (wasmMemory) { if (!isSharedArrayBuffer(wasmMemory.buffer)) { throw new Error('Multithread features require shared wasm memory. ' + 'Try to compile with `-matomics -mbulk-memory` and use `--import-memory --shared-memory` during linking, ' + 'then create WebAssembly.Memory with `shared: true` option'); } } else { if (typeof SharedArrayBuffer === 'undefined') { throw new Error('Current environment does not support SharedArrayBuffer, threads are not available!'); } } } function getReuseWorker(value) { var _a; if (typeof value === 'boolean') { return value ? { size: 0, strict: false } : false; } if (typeof value === 'number') { if (!(value >= 0)) { throw new RangeError('reuseWorker: size must be a non-negative integer'); } return { size: value, strict: false }; } if (!value) { return false; } var size = (_a = Number(value.size)) !== null && _a !== void 0 ? _a : 0; var strict = Boolean(value.strict); if (!(size > 0) && strict) { throw new RangeError('reuseWorker: size must be set to positive integer if strict is set to true'); } return { size: size, strict: strict }; } var nextWorkerID = 0; /** @public */ var ThreadManager = /*#__PURE__*/ (function () { function ThreadManager(options) { var _a; this.unusedWorkers = []; this.runningWorkers = []; this.pthreads = Object.create(null); this.wasmModule = null; this.wasmMemory = null; this.messageEvents = new WeakMap(); if (!options) { throw new TypeError('ThreadManager(): options is not provided'); } if ('childThread' in options) { this._childThread = Boolean(options.childThread); } else { this._childThread = false; } if (this._childThread) { this._onCreateWorker = undefined; this._reuseWorker = false; this._beforeLoad = undefined; } else { this._onCreateWorker = options.onCreateWorker; this._reuseWorker = getReuseWorker(options.reuseWorker); this._beforeLoad = options.beforeLoad; } this.printErr = (_a = options.printErr) !== null && _a !== void 0 ? _a : console.error.bind(console); } Object.defineProperty(ThreadManager.prototype, "nextWorkerID", { get: function () { return nextWorkerID; }, enumerable: false, configurable: true }); ThreadManager.prototype.init = function () { if (!this._childThread) { this.initMainThread(); } }; ThreadManager.prototype.initMainThread = function () { this.preparePool(); }; ThreadManager.prototype.preparePool = function () { if (this._reuseWorker) { if (this._reuseWorker.size) { var pthreadPoolSize = this._reuseWorker.size; while (pthreadPoolSize--) { this.allocateUnusedWorker(); } } } }; ThreadManager.prototype.shouldPreloadWorkers = function () { return !this._childThread && this._reuseWorker && this._reuseWorker.size > 0; }; ThreadManager.prototype.loadWasmModuleToAllWorkers = function () { var _this_1 = this; var promises = Array(this.unusedWorkers.length); var _loop_1 = function (i) { var worker = this_1.unusedWorkers[i]; promises[i] = this_1.loadWasmModuleToWorker(worker).then(function (w) { return w; }, function (e) { throw e; }); }; var this_1 = this; for (var i = 0; i < this.unusedWorkers.length; ++i) { _loop_1(i); } return Promise.all(promises).catch(function (err) { _this_1.terminateAllThreads(); throw err; }); }; ThreadManager.prototype.preloadWorkers = function () { if (this.shouldPreloadWorkers()) { return this.loadWasmModuleToAllWorkers(); } return Promise.resolve([]); }; ThreadManager.prototype.setup = function (wasmModule, wasmMemory) { this.wasmModule = wasmModule; this.wasmMemory = wasmMemory; }; ThreadManager.prototype.markId = function (worker) { if (worker.__emnapi_tid) return worker.__emnapi_tid; var tid = nextWorkerID + 43; nextWorkerID = (nextWorkerID + 1) % (WASI_THREADS_MAX_TID - 42); this.pthreads[tid] = worker; worker.__emnapi_tid = tid; return tid; }; ThreadManager.prototype.returnWorkerToPool = function (worker) { var tid = worker.__emnapi_tid; if (tid !== undefined) { delete this.pthreads[tid]; } this.unusedWorkers.push(worker); this.runningWorkers.splice(this.runningWorkers.indexOf(worker), 1); delete worker.__emnapi_tid; }; ThreadManager.prototype.loadWasmModuleToWorker = function (worker, sab) { var _this_1 = this; if (worker.whenLoaded) return worker.whenLoaded; var err = this.printErr; var beforeLoad = this._beforeLoad; // eslint-disable-next-line @typescript-eslint/no-this-alias var _this = this; worker.whenLoaded = new Promise(function (resolve, reject) { var handleError = function (e) { var message = 'worker sent an error!'; if (worker.__emnapi_tid !== undefined) { message = 'worker (tid = ' + worker.__emnapi_tid + ') sent an error!'; } err(message + ' ' + e.message); if (e.message.indexOf('RuntimeError') !== -1 || e.message.indexOf('unreachable') !== -1) { try { _this.terminateAllThreads(); } catch (_) { } } reject(e); throw e; }; var handleMessage = function (data) { if (data.__emnapi__) { var type = data.__emnapi__.type; var payload = 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 === 'cleanup-thread') { if (payload.tid in _this_1.pthreads) { _this_1.cleanThread(worker, payload.tid); } } } }; worker.onmessage = function (e) { handleMessage(e.data); _this_1.fireMessageEvent(worker, e); }; worker.onerror = handleError; if (typeof beforeLoad === 'function') { beforeLoad(worker); } try { worker.postMessage(createMessage('load', { wasmModule: _this_1.wasmModule, wasmMemory: _this_1.wasmMemory, sab: sab })); } catch (err) { checkSharedWasmMemory(_this_1.wasmMemory); throw err; } }); return worker.whenLoaded; }; ThreadManager.prototype.allocateUnusedWorker = function () { var _onCreateWorker = this._onCreateWorker; if (typeof _onCreateWorker !== 'function') { throw new TypeError('`options.onCreateWorker` is not provided'); } var worker = _onCreateWorker({ type: 'thread', name: 'emnapi-pthread' }); this.unusedWorkers.push(worker); return worker; }; ThreadManager.prototype.getNewWorker = function (sab) { if (this._reuseWorker) { if (this.unusedWorkers.length === 0) { if (this._reuseWorker.strict) { { var err = this.printErr; err('Tried to spawn a new thread, but the thread pool is exhausted.\n' + 'This might result in a deadlock unless some threads eventually exit or the code explicitly breaks out to the event loop.'); return; } } var worker_1 = this.allocateUnusedWorker(); // eslint-disable-next-line @typescript-eslint/no-floating-promises this.loadWasmModuleToWorker(worker_1, sab); } return this.unusedWorkers.pop(); } var worker = this.allocateUnusedWorker(); // eslint-disable-next-line @typescript-eslint/no-floating-promises this.loadWasmModuleToWorker(worker, sab); return this.unusedWorkers.pop(); }; ThreadManager.prototype.cleanThread = function (worker, tid, force) { if (!force && this._reuseWorker) { this.returnWorkerToPool(worker); } else { delete this.pthreads[tid]; var index = this.runningWorkers.indexOf(worker); if (index !== -1) { this.runningWorkers.splice(index, 1); } this.terminateWorker(worker); delete worker.__emnapi_tid; } }; ThreadManager.prototype.terminateWorker = function (worker) { var _this_1 = this; var _a; var tid = worker.__emnapi_tid; // eslint-disable-next-line @typescript-eslint/no-floating-promises worker.terminate(); (_a = this.messageEvents.get(worker)) === null || _a === void 0 ? void 0 : _a.clear(); this.messageEvents.delete(worker); worker.onmessage = function (e) { if (e.data.__emnapi__) { var err = _this_1.printErr; err('received "' + e.data.__emnapi__.type + '" command from terminated worker: ' + tid); } }; }; ThreadManager.prototype.terminateAllThreads = function () { for (var i = 0; i < this.runningWorkers.length; ++i) { this.terminateWorker(this.runningWorkers[i]); } for (var i = 0; i < this.unusedWorkers.length; ++i) { this.terminateWorker(this.unusedWorkers[i]); } this.unusedWorkers = []; this.runningWorkers = []; this.pthreads = Object.create(null); this.preparePool(); }; ThreadManager.prototype.addMessageEventListener = function (worker, onMessage) { var listeners = this.messageEvents.get(worker); if (!listeners) { listeners = new Set(); this.messageEvents.set(worker, listeners); } listeners.add(onMessage); return function () { listeners === null || listeners === void 0 ? void 0 : listeners.delete(onMessage); }; }; ThreadManager.prototype.fireMessageEvent = function (worker, e) { var listeners = this.messageEvents.get(worker); if (!listeners) return; var err = this.printErr; listeners.forEach(function (listener) { try { listener(e); } catch (e) { err(e.stack); } }); }; return ThreadManager; }()); var kIsProxy = Symbol('kIsProxy'); /** @public */ function createInstanceProxy(instance, memory) { if (instance[kIsProxy]) return instance; // https://github.com/nodejs/help/issues/4102 var originalExports = instance.exports; 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 _initialize = function () { }; var _start = function () { return 0; }; handler.get = function (_target, p, receiver) { var _a; if (p === 'memory') { return (_a = (typeof memory === 'function' ? memory() : memory)) !== null && _a !== void 0 ? _a : Reflect.get(originalExports, p, receiver); } if (p === '_initialize') { return p in originalExports ? _initialize : undefined; } if (p === '_start') { return p in originalExports ? _start : undefined; } return Reflect.get(originalExports, p, receiver); }; handler.has = function (_target, p) { if (p === 'memory') return true; return Reflect.has(originalExports, p); }; var exportsProxy = new Proxy(Object.create(null), handler); return new Proxy(instance, { get: function (target, p, receiver) { if (p === 'exports') { return exportsProxy; } if (p === kIsProxy) { return true; } return Reflect.get(target, p, receiver); } }); } var patchedWasiInstances = new WeakMap(); /** @public */ var WASIThreads = /*#__PURE__*/ (function () { function WASIThreads(options) { var _this_1 = this; if (!options) { throw new TypeError('WASIThreads(): options is not provided'); } if (!options.wasi) { throw new TypeError('WASIThreads(): options.wasi is not provided'); } patchedWasiInstances.set(this, new WeakSet()); var wasi = options.wasi; patchWasiInstance(this, wasi); this.wasi = wasi; if ('childThread' in options) { this.childThread = Boolean(options.childThread); } else { this.childThread = false; } this.PThread = undefined; if ('threadManager' in options) { if (typeof options.threadManager === 'function') { this.PThread = options.threadManager(); } else { this.PThread = options.threadManager; } } else { if (!this.childThread) { this.PThread = new ThreadManager(options); this.PThread.init(); } } var waitThreadStart = false; if ('waitThreadStart' in options) { waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart); } var postMessage = getPostMessage(options); if (this.childThread && typeof postMessage !== 'function') { throw new TypeError('options.postMessage is not a function'); } this.postMessage = postMessage; var wasm64 = Boolean(options.wasm64); var onMessage = function (e) { if (e.data.__emnapi__) { var type = e.data.__emnapi__.type; var payload = e.data.__emnapi__.payload; if (type === 'spawn-thread') { threadSpawn(payload.startArg, payload.errorOrTid); } else if (type === 'terminate-all-threads') { _this_1.terminateAllThreads(); } } }; var threadSpawn = function (startArg, errorOrTid) { var _a; var EAGAIN = 6; var isNewABI = errorOrTid !== undefined; try { checkSharedWasmMemory(_this_1.wasmMemory); } catch (err) { (_a = _this_1.PThread) === null || _a === void 0 ? void 0 : _a.printErr(err.stack); if (isNewABI) { var struct_1 = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2); Atomics.store(struct_1, 0, 1); Atomics.store(struct_1, 1, EAGAIN); Atomics.notify(struct_1, 1); return 1; } else { return -6; } } if (!isNewABI) { var malloc = _this_1.wasmInstance.exports.malloc; errorOrTid = wasm64 ? Number(malloc(BigInt(8))) : malloc(8); if (!errorOrTid) { return -48; /* ENOMEM */ } } var _free = _this_1.wasmInstance.exports.free; var free = wasm64 ? function (ptr) { _free(BigInt(ptr)); } : _free; var struct = new Int32Array(_this_1.wasmMemory.buffer, errorOrTid, 2); Atomics.store(struct, 0, 0); Atomics.store(struct, 1, 0); if (_this_1.childThread) { postMessage(createMessage('spawn-thread', { 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 shouldWait = waitThreadStart || (waitThreadStart === 0); var sab; if (shouldWait) { sab = new Int32Array(new SharedArrayBuffer(16 + 8192)); Atomics.store(sab, 0, 0); } var worker; var tid; var PThread = _this_1.PThread; try { worker = PThread.getNewWorker(sab); if (!worker) { throw new Error('failed to get new worker'); } PThread.addMessageEventListener(worker, onMessage); tid = PThread.markId(worker); if (ENVIRONMENT_IS_NODE) ; worker.postMessage(createMessage('start', { tid: tid, arg: startArg, sab: sab })); if (shouldWait) { if (typeof waitThreadStart === 'number') { var waitResult = Atomics.wait(sab, 0, 0, waitThreadStart); if (waitResult === 'timed-out') { try { PThread.cleanThread(worker, tid, true); } catch (_) { } throw new Error('Spawning thread timed out. Please check if the worker is created successfully and if message is handled properly in the worker.'); } } else { Atomics.wait(sab, 0, 0); } var r = Atomics.load(sab, 0); if (r > 1) { try { PThread.cleanThread(worker, tid, true); } catch (_) { } throw deserizeErrorFromBuffer(sab.buffer); } } } catch (e) { Atomics.store(struct, 0, 1); Atomics.store(struct, 1, EAGAIN); Atomics.notify(struct, 1); PThread === null || PThread === void 0 ? void 0 : PThread.printErr(e.stack); if (isNewABI) { return 1; } free(errorOrTid); return -6; } Atomics.store(struct, 0, 0); Atomics.store(struct, 1, tid); Atomics.notify(struct, 1); PThread.runningWorkers.push(worker); if (!shouldWait) { worker.whenLoaded.catch(function (err) { delete worker.whenLoaded; PThread.cleanThread(worker, tid, true); throw err; }); } if (isNewABI) { return 0; } free(errorOrTid); return tid; }; this.threadSpawn = threadSpawn; } WASIThreads.prototype.getImportObject = function () { return { wasi: { 'thread-spawn': this.threadSpawn } }; }; WASIThreads.prototype.setup = function (wasmInstance, wasmModule, wasmMemory) { wasmMemory !== null && wasmMemory !== void 0 ? wasmMemory : (wasmMemory = wasmInstance.exports.memory); this.wasmInstance = wasmInstance; this.wasmMemory = wasmMemory; if (this.PThread) { this.PThread.setup(wasmModule, wasmMemory); } }; WASIThreads.prototype.preloadWorkers = function () { if (this.PThread) { return this.PThread.preloadWorkers(); } return Promise.resolve([]); }; /** * It's ok to call this method to a WASI command module. * * in child thread, must call this method instead of {@link WASIThreads.start} even if it's a WASI command module * * @returns A proxied WebAssembly instance if in child thread, other wise the original instance */ WASIThreads.prototype.initialize = function (instance, module, memory) { var exports = instance.exports; memory !== null && memory !== void 0 ? memory : (memory = exports.memory); if (this.childThread) { instance = createInstanceProxy(instance, memory); } this.setup(instance, module, memory); var wasi = this.wasi; if (('_start' in exports) && (typeof exports._start === 'function')) { if (this.childThread) { wasi.start(instance); try { var kStarted = getWasiSymbol(wasi, 'kStarted'); wasi[kStarted] = false; } catch (_) { } } else { setupInstance$1(wasi, instance); } } else { wasi.initialize(instance); } return instance; }; /** * Equivalent to calling {@link WASIThreads.initialize} and then calling {@link WASIInstance.start} * ```js * this.initialize(instance, module, memory) * this.wasi.start(instance) * ``` */ WASIThreads.prototype.start = function (instance, module, memory) { var exports = instance.exports; memory !== null && memory !== void 0 ? memory : (memory = exports.memory); if (this.childThread) { instance = createInstanceProxy(instance, memory); } this.setup(instance, module, memory); var exitCode = this.wasi.start(instance); return { exitCode: exitCode, instance: instance }; }; WASIThreads.prototype.terminateAllThreads = function () { var _a; if (!this.childThread) { (_a = this.PThread) === null || _a === void 0 ? void 0 : _a.terminateAllThreads(); } else { this.postMessage(createMessage('terminate-all-threads', {})); } }; return WASIThreads; }()); function patchWasiInstance(wasiThreads, wasi) { var patched = patchedWasiInstances.get(wasiThreads); if (patched.has(wasi)) { return; } var _this = wasiThreads; var wasiImport = wasi.wasiImport; if (wasiImport) { var proc_exit_1 = wasiImport.proc_exit; wasiImport.proc_exit = function (code) { _this.terminateAllThreads(); return proc_exit_1.call(this, code); }; } var start = wasi.start; if (typeof start === 'function') { wasi.start = function (instance) { try { return start.call(this, instance); } catch (err) { if (isTrapError(err)) { _this.terminateAllThreads(); } throw err; } }; } patched.add(wasi); } function getWasiSymbol(wasi, description) { var symbols = Object.getOwnPropertySymbols(wasi); var selectDescription = function (description) { return function (s) { if (s.description) { return s.description === description; } return s.toString() === "Symbol(".concat(description, ")"); }; }; if (Array.isArray(description)) { return description.map(function (d) { return symbols.filter(selectDescription(d))[0]; }); } return symbols.filter(selectDescription(description))[0]; } function setupInstance$1(wasi, instance) { var _a = getWasiSymbol(wasi, ['kInstance', 'kSetMemory']), kInstance = _a[0], kSetMemory = _a[1]; wasi[kInstance] = instance; wasi[kSetMemory](instance.exports.memory); } /** @public */ var ThreadMessageHandler = /*#__PURE__*/ (function () { function ThreadMessageHandler(options) { var postMsg = getPostMessage(options); if (typeof postMsg !== 'function') { throw new TypeError('options.postMessage is not a function'); } this.postMessage = postMsg; this.onLoad = options === null || options === void 0 ? void 0 : options.onLoad; this.instance = undefined; // this.module = undefined this.messagesBeforeLoad = []; } /** @virtual */ ThreadMessageHandler.prototype.instantiate = function (data) { if (typeof this.onLoad === 'function') { return this.onLoad(data); } throw new Error('ThreadMessageHandler.prototype.instantiate is not implemented'); }; /** @virtual */ ThreadMessageHandler.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; if (type === 'load') { this._load(payload_1); } else if (type === 'start') { this.handleAfterLoad(e, function () { _this._start(payload_1); }); } } }; ThreadMessageHandler.prototype._load = function (payload) { var _this = this; if (this.instance !== undefined) return; var source; try { source = this.instantiate(payload); } catch (err) { this._loaded(err, null, payload); return; } 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) { _this._loaded(null, source, payload); }, function (err) { _this._loaded(err, null, payload); }); } else { this._loaded(null, source, payload); } }; ThreadMessageHandler.prototype._start = function (payload) { if (typeof this.instance.exports.wasi_thread_start !== 'function') { var err = new TypeError('wasi_thread_start is not exported'); notifyPthreadCreateResult(payload.sab, 2, err); throw err; } var postMessage = this.postMessage; var tid = payload.tid; var startArg = payload.arg; notifyPthreadCreateResult(payload.sab, 1); try { this.instance.exports.wasi_thread_start(tid, startArg); } catch (err) { if (isTrapError(err)) { postMessage(createMessage('terminate-all-threads', {})); } throw err; } postMessage(createMessage('cleanup-thread', { tid: tid })); }; ThreadMessageHandler.prototype._loaded = function (err, source, payload) { if (err) { notifyPthreadCreateResult(payload.sab, 2, err); throw err; } if (source == null) { var err_1 = new TypeError('onLoad should return an object'); notifyPthreadCreateResult(payload.sab, 2, err_1); throw err_1; } var instance = source.instance; if (!instance) { var err_2 = new TypeError('onLoad should return an object which includes "instance"'); notifyPthreadCreateResult(payload.sab, 2, err_2); throw err_2; } this.instance = instance; var postMessage = this.postMessage; postMessage(createMessage('loaded', {})); var messages = this.messagesBeforeLoad; this.messagesBeforeLoad = []; for (var i = 0; i < messages.length; i++) { var data = messages[i]; this.handle({ data: data }); } }; ThreadMessageHandler.prototype.handleAfterLoad = function (e, f) { if (this.instance !== undefined) { f.call(this, e); } else { this.messagesBeforeLoad.push(e.data); } }; return ThreadMessageHandler; }()); function notifyPthreadCreateResult(sab, result, error) { if (sab) { serizeErrorToBuffer(sab.buffer, result, error); Atomics.notify(sab, 0); } } /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ 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); }; 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 __()); } typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; /* eslint-disable no-undef */ var _WebAssembly$1 = typeof WebAssembly !== 'undefined' ? WebAssembly : typeof WXWebAssembly !== 'undefined' ? WXWebAssembly : undefined; function validateImports(imports) { 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); } // 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); } 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 { return load(fetch(wasmInput), imports); } } 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; } function createNapiModule(options) { var napiModule = (function () { var ENVIRONMENT_IS_PTHREAD = Boolean(options.childThread); var waitThreadStart = typeof options.waitThreadStart === 'number' ? options.waitThreadStart : Boolean(options.waitThreadStart); var wasmInstance; 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: ENVIRONMENT_IS_PTHREAD, initWorker: undefined, executeAsyncWork: undefined, waitThreadStart: waitThreadStart, PThread: 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'); 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 = undefined; 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; var PThread = new ThreadManager(ENVIRONMENT_IS_PTHREAD ? { printErr: err, childThread: true } : { printErr: err, beforeLoad: function (worker) { emnapiAddSendListener(worker); }, reuseWorker: options.reuseWorker, onCreateWorker: onCreateWorker }); napiModule.PThread = PThread; /** * @__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); }); } 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 } } }); } 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(); }; }); uvThreadpoolReady.ready = false; /** @__sig i */ function _emnapi_is_main_browser_thread() { return (typeof window !== 'undefined' && typeof document !== 'undefined' && true) ? 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 }); /* 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); } }; 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 */; } } 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 const nativeCallbackScopePointer = emnapiNodeBinding.node.openCallbackScope(resource, { asyncId: async_id, triggerAsyncId: trigger_async_id }) from64('result') $_TODO_makeSetValue('result', 0, 'nativeCallbackScopePointer', 'i64') } vp export function _emnapi_node_close_callback_scope (scope: Pointer): void { if (!emnapiNodeBinding || !scope) return from64('scope') 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 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 >= 10 ? 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' && true; 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' && true; 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 => { const i32a = new Int32Array(wasmMemory.buffer, index, 1) const oldValue = Atomics.compareExchange(i32a, 0, 0, 1) if (oldValue === 0) { resolve() return } (Atomics as any).waitAsync(i32a, 0, 1).value.then(again) } 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(); } } /* , executeAsync (fn: () => Promise): Promise { return mutex.lockAsync().then(() => { const r = fn() mutex.unlock() return r }, (err) => { 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 () { const i32a = new Int32Array(wasmMemory.buffer, index, 1) const value = Atomics.load(i32a, 0) mutex.unlock() const lock = (): Promise => mutex.lockAsync() try { return (Atomics as any).waitAsync(i32a, 0, value).value.then(lock, lock) } catch (err) { 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); // 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); (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 } } }); } 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 /* ReferenceOwnership.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 /* ReferenceOwnership.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', name: 'emnapi-async-worker' }); 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); } } }; /** @__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 /* ReferenceOwnership.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; } } return false; }, getArrayBufferPointer: function (arrayBuffer, shouldCopy) { var _a; var info = { address: 0, ownership: 0 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.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 /* ReferenceOwnership.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_1 = emnapiCtx.feature.Buffer; if (typeof Buffer_1 === 'function' && Ctor === Buffer_1) { newView = Buffer_1.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 /* ReferenceOwnership.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; } return emnapiString.utf8Decoder.decode(((typeof SharedArrayBuffer === "function" && HEAPU8.buffer instanceof SharedArrayBuffer) || (Object.prototype.toString.call(HEAPU8.buffer) === "[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) === "[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 >= 10 ? 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 >= 10 ? 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); } 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(emnapiCtx.feature.Buffer)) return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); if (handle.isDataView()) { return napi_get_dataview_info(env, buffer, length, data, 0, 0); } 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 >= 10 ? 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(); 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 */ -9223372036854776e3) { HEAP_DATA_VIEW.setInt32(result, 0, true); HEAP_DATA_VIEW.setInt32(result + 4, 2147483648, true); } else if (numberValue >= /* INT64_RANGE_POSITIVE */ 9223372036854776000) { HEAP_DATA_VIEW.setUint32(result, 4294967295, true); HEAP_DATA_VIEW.setUint32(result + 4, 2147483647, 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); }); } /** * @__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_latin1(env, str, length, result) { return napi_create_string_latin1(env, str, length, result); } /** * @__sig ipppp */ function node_api_create_property_key_utf8(env, str, length, result) { return napi_create_string_utf8(env, str, length, result); } /** * @__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 >= 10 ? 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_latin1: node_api_create_property_key_latin1, node_api_create_property_key_utf16: node_api_create_property_key_utf16, node_api_create_property_key_utf8: node_api_create_property_key_utf8 }); function emnapiCreateFunction(envObject, utf8name, length, cb, data) { var functionName = (!utf8name || !length) ? '' : (emnapiString.UTF8ToString(utf8name, length)); var f; var napiCallback = (wasmTable.get(cb)); var callback = function (envObject) { return napiCallback(envObject.id, envObject.ctx.scopeStore.currentScope.id); }; var makeFunction = function (envObject, callback) { return function () { var scope = envObject.ctx.openScope(envObject); var callbackInfo = scope.callbackInfo; callbackInfo.data = data; callbackInfo.args = arguments; callbackInfo.thiz = this; callbackInfo.fn = f; try { var napiValue = envObject.callIntoModule(callback); return (!napiValue) ? undefined : envObject.ctx.handleStore.get(napiValue).value; } finally { callbackInfo.data = 0; callbackInfo.args = undefined; callbackInfo.thiz = undefined; callbackInfo.fn = undefined; envObject.ctx.closeScope(envObject, scope); } }; }; if (functionName === '') { f = makeFunction(envObject, callback); 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(envObject, callback); try { f = (new Function('_', 'return function ' + functionName + '(){' + '"use strict";' + 'return _.apply(this,arguments);' + '};'))(_); } catch (_err) { f = makeFunction(envObject, callback); if (emnapiCtx.feature.canSetFunctionName) Object.defineProperty(f, 'name', { value: functionName }); } } else { f = makeFunction(envObject, callback); 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 >= 10 ? 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.createReferenceWithFinalizer(envObject, handle.id, 0, 1 /* ReferenceOwnership.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 { if (finalize_cb) { reference = emnapiCtx.createReferenceWithFinalizer(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, finalize_cb, native_object, finalize_hint); } else { reference = emnapiCtx.createReferenceWithData(envObject, handle.id, 0, 0 /* ReferenceOwnership.kRuntime */, native_object); } } 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 >= 10 ? 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 /* ReferenceOwnership.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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.kUserland */; var reference = emnapiCtx.createReferenceWithFinalizer(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 >= 10 ? 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 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 }; break; case 1 /* emnapi_memory_view_type.emnapi_uint8_array */: viewDescriptor = { Ctor: Uint8Array, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.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 /* ReferenceOwnership.kUserland */, runtimeAllocated: 0 }; break; case -1 /* emnapi_memory_view_type.emnapi_data_view */: viewDescriptor = { Ctor: DataView, address: external_data, length: byte_length, ownership: 1 /* ReferenceOwnership.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 /* ReferenceOwnership.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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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(data); if (finalize_cb) { emnapiCtx.createReferenceWithFinalizer(envObject, externalHandle.id, 0, 0 /* ReferenceOwnership.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 >= 10 ? 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 /* ReferenceOwnership.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 >= 10 ? 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); if (!handle.isArrayBuffer()) { return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); } var buffer = handle.value; 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 /* ReferenceOwnership.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 >= 10 ? 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 /* ReferenceOwnership.kRuntime */ : 1 /* ReferenceOwnership.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 >= 10 ? 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 node_api_create_buffer_from_arraybuffer(env, arraybuffer, byte_offset, byte_length, 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 >= 10 ? 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_offset = byte_offset >>> 0; byte_length = byte_length >>> 0; var handle = emnapiCtx.handleStore.get(arraybuffer); if (!handle.isArrayBuffer()) { return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); } var buffer = handle.value; if ((byte_length + byte_offset) > buffer.byteLength) { var err = new RangeError('The byte offset + length is out of range'); err.code = 'ERR_OUT_OF_RANGE'; throw err; } var Buffer = emnapiCtx.feature.Buffer; if (!Buffer) { throw emnapiCtx.createNotSupportBufferError('node_api_create_buffer_from_arraybuffer', ''); } var out = Buffer.from(buffer, byte_offset, byte_length); if (buffer === wasmMemory.buffer) { if (!emnapiExternalMemory.wasmMemoryViewTable.has(out)) { emnapiExternalMemory.wasmMemoryViewTable.set(out, { Ctor: Buffer, address: byte_offset, length: byte_length, ownership: 1 /* ReferenceOwnership.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(); } catch (err) { envObject.tryCatch.setError(err); return envObject.setLastError(10 /* napi_status.napi_pending_exception */); } } /** * @__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 >= 10 ? 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); if (!handle.isArrayBuffer()) { return envObject.setLastError(1 /* napi_status.napi_invalid_arg */); } var buffer = handle.value; 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 /* ReferenceOwnership.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_create_buffer_from_arraybuffer: node_api_create_buffer_from_arraybuffer, 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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.scopeStore.get(cbinfo).callbackInfo; 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 >= 10 ? 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 >= 10 ? 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.scopeStore.get(cbinfo).callbackInfo; var thiz = cbinfoValue.thiz, fn = cbinfoValue.fn; var value = thiz == null || thiz.constructor == null ? 0 : thiz instanceof fn ? envObject.ensureHandleId(thiz.constructor) : 0; 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 < 10) { 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 /* ReferenceOwnership.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 */; var envObject = emnapiCtx.envStore.get(env); 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(envObject); 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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 >= 10 ? 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(emnapiCtx.feature.Buffer) ? 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 >= 10 ? 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 >= 10 ? 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 = 10 /* 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(); PThread.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'); } 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 wasiThreads; var importObject = { env: napiModule.imports.env, napi: napiModule.imports.napi, emnapi: napiModule.imports.emnapi }; if (wasi) { wasiThreads = new WASIThreads(napiModule.childThread ? { wasi: wasi, childThread: true, postMessage: napiModule.postMessage } : { wasi: wasi, threadManager: napiModule.PThread, waitThreadStart: napiModule.waitThreadStart }); Object.assign(importObject, typeof wasi.getImportObject === 'function' ? wasi.getImportObject() : { wasi_snapshot_preview1: wasi.wasiImport }); Object.assign(importObject, wasiThreads.getImportObject()); } var overwriteImports = options.overwriteImports; if (typeof overwriteImports === 'function') { var newImportObject = overwriteImports(importObject); if (typeof newImportObject === 'object' && newImportObject !== null) { importObject = newImportObject; } } 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) { instance = wasiThreads.initialize(instance, module, memory); } else { napiModule.PThread.setup(module, memory); } var emnapiInit = function () { if (beforeInit) { beforeInit({ instance: originalInstance, module: module }); } napiModule.init({ instance: instance, module: module, memory: memory, table: table }); var ret = { instance: originalInstance, module: module, usedInstance: instance }; { ret.napiModule = napiModule; } return ret; }; if (napiModule.PThread.shouldPreloadWorkers()) { var poolReady = napiModule.PThread.loadWasmModuleToAllWorkers(); if (loadFn === loadCallback) { return poolReady.then(emnapiInit); } else { throw new Error('Synchronous loading is not supported with worker pool (reuseWorker.size > 0)'); } } return emnapiInit(); }); } function loadCallback(wasmInput, importObject, callback) { 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); } /** @public */ function instantiateNapiModule( /** 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); } /** @public */ var MessageHandler = /*#__PURE__*/ (function (_super) { __extends(MessageHandler, _super); function MessageHandler(options) { var _this = this; if (typeof options.onLoad !== 'function') { throw new TypeError('options.onLoad is not a function'); } _this = _super.call(this, options) || this; _this.napiModule = undefined; return _this; } MessageHandler.prototype.instantiate = function (data) { var _this = this; var source = this.onLoad(data); var then = source.then; if (typeof then === 'function') { return source.then(function (result) { _this.napiModule = result.napiModule; return result; }); } this.napiModule = source.napiModule; return source; }; MessageHandler.prototype.handle = function (e) { var _this = this; var _a; _super.prototype.handle.call(this, e); 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; if (type === 'async-worker-init') { this.handleAfterLoad(e, function () { _this.napiModule.initWorker(payload_1.arg); }); } else if (type === 'async-work-execute') { this.handleAfterLoad(e, function () { _this.napiModule.executeAsyncWork(payload_1.work); }); } } }; return MessageHandler; }(ThreadMessageHandler)); var externalValue = new WeakMap(); /** @public */ function isExternal(object) { return externalValue.has(object); } /** @public */ // eslint-disable-next-line @typescript-eslint/no-redeclare var External = (function () { function External(value) { Object.setPrototypeOf(this, null); externalValue.set(this, value); } External.prototype = null; return External; })(); /** @public */ function getExternalValue(external) { if (!isExternal(external)) { throw new TypeError('not external'); } return externalValue.get(external); } 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; } 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; }()); 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 supportReflect = typeof Reflect === 'object'; 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; })(); var supportBigInt = typeof BigInt !== 'undefined'; var _require = /*#__PURE__*/ (function () { var nativeRequire; { nativeRequire = (function () { return (typeof require !== 'undefined' ? require : undefined); })(); } return nativeRequire; })(); var _MessageChannel = typeof MessageChannel === 'function' ? MessageChannel : /*#__PURE__*/ (function () { try { return _require('worker_threads').MessageChannel; } catch (_) { } return undefined; })(); var _setImmediate = typeof setImmediate === 'function' ? setImmediate : function (callback) { if (typeof callback !== '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' ? Buffer : /*#__PURE__*/ (function () { try { return _require('buffer').Buffer; } catch (_) { } return undefined; })(); var version = "1.4.3"; var NODE_API_SUPPORTED_VERSION_MAX = 10 /* 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 () { return getExternalValue(this.value); }; 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 isExternal(this.value); }; 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 (BufferConstructor) { if (ArrayBuffer.isView(this.value)) return true; BufferConstructor !== null && BufferConstructor !== void 0 ? BufferConstructor : (BufferConstructor = _Buffer); return typeof BufferConstructor === 'function' && BufferConstructor.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)); 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; }()); 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; this.callbackInfo = { thiz: undefined, data: 0, args: undefined, fn: undefined }; } HandleScope.prototype.add = function (value) { var h = this.handleStore.push(value); this.end++; return h; }; HandleScope.prototype.addExternal = function (data) { return this.add(new External(data)); }; HandleScope.prototype.dispose = function () { if (this._escapeCalled) this._escapeCalled = false; 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; this._values = [undefined]; } ScopeStore.prototype.get = function (id) { return this._values[id]; }; ScopeStore.prototype.openScope = function (envObject) { var currentScope = this.currentScope; var scope = currentScope.child; if (scope !== null) { scope.start = scope.end = currentScope.end; } else { var id = currentScope.id + 1; scope = new HandleScope(envObject.ctx.handleStore, id, currentScope, currentScope.end); this._values[id] = scope; } 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 () { this.currentScope = this._rootScope; this._values.length = 1; }; return ScopeStore; }()); var RefTracker = /*#__PURE__*/ (function () { function RefTracker() { this._next = null; this._prev = null; } /** @virtual */ RefTracker.prototype.dispose = function () { }; /** @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; this._makeDynCall_vppp = envObject.makeDynCall_vppp; } Finalizer.prototype.callback = function () { return this._finalizeCallback; }; Finalizer.prototype.data = function () { return this._finalizeData; }; Finalizer.prototype.hint = function () { return this._finalizeHint; }; Finalizer.prototype.resetEnv = function () { this.envObject = undefined; }; Finalizer.prototype.resetFinalizer = function () { this._finalizeCallback = 0; this._finalizeData = 0; this._finalizeHint = 0; }; Finalizer.prototype.callFinalizer = function () { var finalize_callback = this._finalizeCallback; var finalize_data = this._finalizeData; var finalize_hint = this._finalizeHint; this.resetFinalizer(); if (!finalize_callback) return; var fini = Number(finalize_callback); if (!this.envObject) { this._makeDynCall_vppp(fini)(0, finalize_data, finalize_hint); } else { this.envObject.callFinalizer(fini, finalize_data, finalize_hint); } }; Finalizer.prototype.dispose = function () { this.envObject = undefined; this._makeDynCall_vppp = 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) || this; _this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint); return _this; } TrackedFinalizer.create = function (envObject, finalize_callback, finalize_data, finalize_hint) { var finalizer = new TrackedFinalizer(envObject, finalize_callback, finalize_data, finalize_hint); finalizer.link(envObject.finalizing_reflist); return finalizer; }; TrackedFinalizer.prototype.data = function () { return this._finalizer.data(); }; TrackedFinalizer.prototype.dispose = function () { if (!this._finalizer) return; this.unlink(); this._finalizer.envObject.dequeueFinalizer(this); this._finalizer.dispose(); this._finalizer = undefined; _super.prototype.dispose.call(this); }; TrackedFinalizer.prototype.finalize = function () { this.unlink(); var error; var caught = false; try { this._finalizer.callFinalizer(); } catch (err) { caught = true; error = err; } this.dispose(); if (caught) { throw error; } }; return TrackedFinalizer; }(RefTracker)); 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); } function handleThrow(envObject, 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; } /** @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; }; 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 () { RefTracker.finalizeAll(this.finalizing_reflist); RefTracker.finalizeAll(this.reflist); this.tryCatch.extractException(); this.ctx.envStore.remove(this.id); }; Env.prototype.dispose = function () { if (this.id === 0) return; this.deleteMe(); this.finalizing_reflist.dispose(); this.reflist.dispose(); this.id = 0; }; Env.prototype.initObjectBinding = function (value) { var binding = { wrapped: 0, tag: null }; 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 = TrackedFinalizer.create(this, 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; _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; } if (envObject.moduleApiVersion < 10 && true && !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; } 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; } return EmnapiError; }(Error)); Object.defineProperty(EmnapiError.prototype, 'name', { 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)); Object.defineProperty(NotSupportWeakRefError.prototype, 'name', { 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)); Object.defineProperty(NotSupportBufferError.prototype, 'name', { 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; }()); var Persistent = /*#__PURE__*/ (function () { 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.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; }()); var ReferenceOwnership; (function (ReferenceOwnership) { ReferenceOwnership[ReferenceOwnership["kRuntime"] = 0] = "kRuntime"; ReferenceOwnership[ReferenceOwnership["kUserland"] = 1] = "kUserland"; })(ReferenceOwnership || (ReferenceOwnership = {})); function canBeHeldWeakly(value) { return value.isObject() || value.isFunction() || value.isSymbol(); } var Reference = /*#__PURE__*/ (function (_super) { __extends(Reference, _super); function Reference(envObject, handle_id, initialRefcount, ownership) { var _this = _super.call(this) || this; _this.envObject = envObject; _this._refcount = initialRefcount; _this._ownership = ownership; var handle = envObject.ctx.handleStore.get(handle_id); _this.canBeWeak = canBeHeldWeakly(handle); _this.persistent = new Persistent(handle.value); _this.id = 0; if (initialRefcount === 0) { _this._setWeak(); } return _this; } Reference.weakCallback = function (ref) { ref.persistent.reset(); ref.invokeFinalizerFromGC(); }; Reference.create = function (envObject, handle_id, initialRefcount, ownership, _unused1, _unused2, _unused3) { var ref = new Reference(envObject, handle_id, initialRefcount, ownership); envObject.ctx.refStore.add(ref); ref.link(envObject.reflist); return ref; }; Reference.prototype.ref = function () { if (this.persistent.isEmpty()) { return 0; } if (++this._refcount === 1 && this.canBeWeak) { this.persistent.clearWeak(); } return this._refcount; }; Reference.prototype.unref = function () { if (this.persistent.isEmpty() || this._refcount === 0) { return 0; } if (--this._refcount === 0) { this._setWeak(); } return this._refcount; }; Reference.prototype.get = function (envObject) { if (envObject === void 0) { envObject = this.envObject; } if (this.persistent.isEmpty()) { return 0; } var obj = this.persistent.deref(); var handle = envObject.ensureHandle(obj); return handle.id; }; /** @virtual */ Reference.prototype.resetFinalizer = function () { }; /** @virtual */ Reference.prototype.data = function () { return 0; }; Reference.prototype.refcount = function () { return this._refcount; }; Reference.prototype.ownership = function () { return this._ownership; }; /** @virtual */ Reference.prototype.callUserFinalizer = function () { }; /** @virtual */ Reference.prototype.invokeFinalizerFromGC = function () { this.finalize(); }; Reference.prototype._setWeak = function () { if (this.canBeWeak) { this.persistent.setWeak(this, Reference.weakCallback); } else { this.persistent.reset(); } }; Reference.prototype.finalize = function () { this.persistent.reset(); var deleteMe = this._ownership === ReferenceOwnership.kRuntime; this.unlink(); this.callUserFinalizer(); if (deleteMe) { this.dispose(); } }; Reference.prototype.dispose = function () { if (this.id === 0) return; this.unlink(); this.persistent.reset(); this.envObject.ctx.refStore.remove(this.id); _super.prototype.dispose.call(this); this.envObject = undefined; this.id = 0; }; return Reference; }(RefTracker)); var ReferenceWithData = /*#__PURE__*/ (function (_super) { __extends(ReferenceWithData, _super); function ReferenceWithData(envObject, value, initialRefcount, ownership, _data) { var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this; _this._data = _data; return _this; } ReferenceWithData.create = function (envObject, value, initialRefcount, ownership, data) { var reference = new ReferenceWithData(envObject, value, initialRefcount, ownership, data); envObject.ctx.refStore.add(reference); reference.link(envObject.reflist); return reference; }; ReferenceWithData.prototype.data = function () { return this._data; }; return ReferenceWithData; }(Reference)); var ReferenceWithFinalizer = /*#__PURE__*/ (function (_super) { __extends(ReferenceWithFinalizer, _super); function ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { var _this = _super.call(this, envObject, value, initialRefcount, ownership) || this; _this._finalizer = new Finalizer(envObject, finalize_callback, finalize_data, finalize_hint); return _this; } ReferenceWithFinalizer.create = function (envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint) { var reference = new ReferenceWithFinalizer(envObject, value, initialRefcount, ownership, finalize_callback, finalize_data, finalize_hint); envObject.ctx.refStore.add(reference); reference.link(envObject.finalizing_reflist); return reference; }; ReferenceWithFinalizer.prototype.resetFinalizer = function () { this._finalizer.resetFinalizer(); }; ReferenceWithFinalizer.prototype.data = function () { return this._finalizer.data(); }; ReferenceWithFinalizer.prototype.callUserFinalizer = function () { this._finalizer.callFinalizer(); }; ReferenceWithFinalizer.prototype.invokeFinalizerFromGC = function () { this._finalizer.envObject.invokeFinalizerFromGC(this); }; ReferenceWithFinalizer.prototype.dispose = function () { if (!this._finalizer) return; this._finalizer.envObject.dequeueFinalizer(this); this._finalizer.dispose(); _super.prototype.dispose.call(this); this._finalizer = undefined; }; return ReferenceWithFinalizer; }(Reference)); 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; }()); 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; }()); var CleanupHookCallback = /*#__PURE__*/ (function () { 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; } 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; }()); var Context = /*#__PURE__*/ (function () { function Context() { this._isStopping = false; this._canCallIntoJs = true; this._suppressDestroy = false; this.envStore = new Store(); this.scopeStore = new ScopeStore(); this.refStore = new Store(); this.deferredStore = new Store(); this.handleStore = new HandleStore(); this.feature = { supportReflect: supportReflect, supportFinalizer: supportFinalizer, supportWeakSymbol: supportWeakSymbol, supportBigInt: supportBigInt, supportNewFunction: supportNewFunction, canSetFunctionName: canSetFunctionName, setImmediate: _setImmediate, Buffer: _Buffer, MessageChannel: _MessageChannel }; this.cleanupQueue = new CleanupQueue(); } /** * Suppress the destroy on `beforeExit` event in Node.js. * Call this method if you want to keep the context and * all associated {@link Env | Env} alive, * this also means that cleanup hooks will not be called. * After call this method, you should call * {@link Context.destroy | `Context.prototype.destroy`} method manually. */ Context.prototype.suppressDestroy = function () { this._suppressDestroy = true; }; // 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) { return Reference.create(envObject, handle_id, initialRefcount, ownership); }; Context.prototype.createReferenceWithData = function (envObject, handle_id, initialRefcount, ownership, data) { return ReferenceWithData.create(envObject, handle_id, initialRefcount, ownership, data); }; Context.prototype.createReferenceWithFinalizer = 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 ReferenceWithFinalizer.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; }; /** * Destroy the context and call cleanup hooks. * Associated {@link Env | Env} will be destroyed. */ Context.prototype.destroy = function () { this.setStopping(true); this.setCanCallIntoJs(false); this.runCleanup(); }; return Context; }()); var defaultContext; function createContext() { return new Context(); } function getDefaultContext() { if (!defaultContext) { defaultContext = createContext(); } return defaultContext; } const _WebAssembly = typeof WebAssembly !== 'undefined' ? WebAssembly : typeof WXWebAssembly !== 'undefined' ? WXWebAssembly : undefined; if (!_WebAssembly) { 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}`); } } function validateArray(value, name) { 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}`); } } function validateString(value, name) { 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}`); } } function validateUndefined(value, name) { 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'); } 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); } const CHAR_DOT = 46; /* . */ const CHAR_FORWARD_SLASH = 47; /* / */ function isPosixPathSeparator(code) { 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; } lastSlash = i; dots = 0; } else if (code === CHAR_DOT && dots !== -1) { ++dots; } else { dots = -1; } } 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; } // 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 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 }; 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'; } } class WasiError extends Error { constructor(message, errno) { super(message); this.errno = errno; } getErrorMessage() { return strerror(this.errno); } } Object.defineProperty(WasiError.prototype, 'name', { 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 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_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_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_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_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; } 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); 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; } } 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; } } 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 */; } 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); } 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; } 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); } 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); } 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--; } } class AsyncTable extends FileDescriptorTable { // 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 */); } 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--; } } /** @public */ 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); } } /** @public */ function extendMemory(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; } /** @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' }); } 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; } const _memory = new WeakMap(); const _wasi = new WeakMap(); const _fs = new WeakMap(); function getMemory(wasi) { return _memory.get(wasi); } function getFs(wasi) { 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; } 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) & -16) || ((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); 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 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); } 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 { _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'); } 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 }; } function initWASI(setMemory, wrap) { 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]; } // 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; } var fsProxy = {}; var hasRequiredFsProxy; function requireFsProxy () { if (hasRequiredFsProxy) return fsProxy; hasRequiredFsProxy = 1; // @ts-check /** * @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 }; /** * @param {import('memfs').IFs} memfs * @param {any} value * @param {ReturnType} type * @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 }); } const json = JSON.stringify(value, (_, value) => { if (typeof value === 'bigint') { return `BigInt(${String(value)})` } if (value instanceof Error) { return { ...value, message: value.message, stack: value.stack, __error__: value.constructor.name, } } 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 {typeof import('memfs')} memfs * @param {Uint8Array} payload * @param {number} type * @returns {any} */ const decodeValue = (memfs, payload, type) => { if (type === 0) return undefined if (type === 1) return null if (type === 2) return Boolean(new Int32Array(payload.buffer, payload.byteOffset, 1)[0]) if (type === 3) return new Float64Array(payload.buffer, payload.byteOffset, 1)[0] if (type === 4) return new TextDecoder().decode(payload.slice()) if (type === 6) { const obj = JSON.parse(new TextDecoder().decode(payload.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__; Object.setPrototypeOf(obj, memfs[ctor].prototype); } if (obj.__error__) { const name = obj.__error__; const ErrorConstructor = globalThis[name] || Error; delete obj.__error__; const err = new ErrorConstructor(obj.message); Object.defineProperty(err, 'stack', { configurable: true, enumerable: false, writable: true, value: err.stack }); Object.defineProperty(err, Symbol.toStringTag, { configurable: true, enumerable: false, writable: true, value: name }); for (const [k, v] of Object.entries(obj)) { if (k === 'message' || k === 'stack') continue err[k] = v; } return err } return obj } if (type === 9) return new BigInt64Array(payload.buffer, payload.byteOffset, 1)[0] throw new Error('unsupported data') }; /** * @param {import('memfs').IFs} fs * @returns {(e: { data: { __fs__: { sab: Int32Array, type: keyof import('memfs').IFs, payload: any[] } } }) => void} */ // oxlint-disable-next-line no-unused-vars -- fixed in an upcoming release fsProxy.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]; try { const ret = fn.apply(fs, payload); Atomics.store(sab, 0, 0); const t = getType(ret); Atomics.store(sab, 1, t); const v = encodeValue(fs, ret, t); Atomics.store(sab, 2, v.length); new Uint8Array(sab.buffer).set(v, 16); } catch (/** @type {any} */ err) { Atomics.store(sab, 0, 1); const t = getType(err); Atomics.store(sab, 1, t); const v = encodeValue(fs, err, t); Atomics.store(sab, 2, v.length); new Uint8Array(sab.buffer).set(v, 16); } finally { Atomics.notify(sab, 0); } } }; /** * @param {typeof import('memfs')} memfs */ fsProxy.createFsProxy = (memfs) => new Proxy({}, { get (_target, p, _receiver) { /** * @param {any[]} args */ return function (...args) { const sab = new SharedArrayBuffer(16 + 10240); const i32arr = new Int32Array(sab); Atomics.store(i32arr, 0, 21); postMessage({ __fs__: { sab: i32arr, type: p, payload: args } }); 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); const value = decodeValue(memfs, content, type); if (status === 1) { throw value } return value } } }); return fsProxy; } var fsProxyExports = requireFsProxy(); var createFsProxy = fsProxyExports.createFsProxy; var createOnMessage = fsProxyExports.createOnMessage; export { MessageHandler, WASI, createFsProxy, createOnMessage, getDefaultContext, instantiateNapiModule, instantiateNapiModuleSync }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL0BlbW5hcGkvd2FzaS10aHJlYWRzL2Rpc3Qvd2FzaS10aHJlYWRzLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9jb3JlL2Rpc3QvZW1uYXBpLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGVtbmFwaS9ydW50aW1lL2Rpc3QvZW1uYXBpLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL0B0eWJ5cy93YXNtLXV0aWwvZGlzdC93YXNtLXV0aWwuZXNtLWJ1bmRsZXIuanMiLCIuLi9mcy1wcm94eS5janMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9XZWJBc3NlbWJseSA9IHR5cGVvZiBXZWJBc3NlbWJseSAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IFdlYkFzc2VtYmx5XG4gICAgOiB0eXBlb2YgV1hXZWJBc3NlbWJseSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBXWFdlYkFzc2VtYmx5XG4gICAgICAgIDogdW5kZWZpbmVkO1xudmFyIEVOVklST05NRU5UX0lTX05PREUgPSB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2VzcyAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG5mdW5jdGlvbiBnZXRQb3N0TWVzc2FnZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc3RNZXNzYWdlKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMucG9zdE1lc3NhZ2VcbiAgICAgICAgOiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gcG9zdE1lc3NhZ2VcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gc2VyaXplRXJyb3JUb0J1ZmZlcihzYWIsIGNvZGUsIGVycm9yKSB7XG4gICAgdmFyIGkzMmFycmF5ID0gbmV3IEludDMyQXJyYXkoc2FiKTtcbiAgICBBdG9taWNzLnN0b3JlKGkzMmFycmF5LCAwLCBjb2RlKTtcbiAgICBpZiAoY29kZSA+IDEgJiYgZXJyb3IpIHtcbiAgICAgICAgdmFyIG5hbWVfMSA9IGVycm9yLm5hbWU7XG4gICAgICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgdmFyIHN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgIHZhciBuYW1lQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG5hbWVfMSk7XG4gICAgICAgIHZhciBtZXNzYWdlQnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKG1lc3NhZ2UpO1xuICAgICAgICB2YXIgc3RhY2tCdWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc3RhY2spO1xuICAgICAgICBBdG9taWNzLnN0b3JlKGkzMmFycmF5LCAxLCBuYW1lQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoaTMyYXJyYXksIDIsIG1lc3NhZ2VCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgQXRvbWljcy5zdG9yZShpMzJhcnJheSwgMywgc3RhY2tCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHNhYik7XG4gICAgICAgIGJ1ZmZlci5zZXQobmFtZUJ1ZmZlciwgMTYpO1xuICAgICAgICBidWZmZXIuc2V0KG1lc3NhZ2VCdWZmZXIsIDE2ICsgbmFtZUJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICBidWZmZXIuc2V0KHN0YWNrQnVmZmVyLCAxNiArIG5hbWVCdWZmZXIubGVuZ3RoICsgbWVzc2FnZUJ1ZmZlci5sZW5ndGgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlc2VyaXplRXJyb3JGcm9tQnVmZmVyKHNhYikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgdmFyIGkzMmFycmF5ID0gbmV3IEludDMyQXJyYXkoc2FiKTtcbiAgICB2YXIgc3RhdHVzID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAwKTtcbiAgICBpZiAoc3RhdHVzIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBuYW1lTGVuZ3RoID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAxKTtcbiAgICB2YXIgbWVzc2FnZUxlbmd0aCA9IEF0b21pY3MubG9hZChpMzJhcnJheSwgMik7XG4gICAgdmFyIHN0YWNrTGVuZ3RoID0gQXRvbWljcy5sb2FkKGkzMmFycmF5LCAzKTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoc2FiKTtcbiAgICB2YXIgbmFtZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiwgMTYgKyBuYW1lTGVuZ3RoKTtcbiAgICB2YXIgbWVzc2FnZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiArIG5hbWVMZW5ndGgsIDE2ICsgbmFtZUxlbmd0aCArIG1lc3NhZ2VMZW5ndGgpO1xuICAgIHZhciBzdGFja0J1ZmZlciA9IGJ1ZmZlci5zbGljZSgxNiArIG5hbWVMZW5ndGggKyBtZXNzYWdlTGVuZ3RoLCAxNiArIG5hbWVMZW5ndGggKyBtZXNzYWdlTGVuZ3RoICsgc3RhY2tMZW5ndGgpO1xuICAgIHZhciBuYW1lID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5hbWVCdWZmZXIpO1xuICAgIHZhciBtZXNzYWdlID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG1lc3NhZ2VCdWZmZXIpO1xuICAgIHZhciBzdGFjayA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShzdGFja0J1ZmZlcik7XG4gICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSAoX2EgPSBnbG9iYWxUaGlzW25hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAobmFtZSA9PT0gJ1J1bnRpbWVFcnJvcicgPyAoKF9iID0gX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogRXJyb3IpIDogRXJyb3IpO1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvckNvbnN0cnVjdG9yKG1lc3NhZ2UpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywge1xuICAgICAgICB2YWx1ZTogc3RhY2ssXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgICByZXR1cm4gKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgfHxcbiAgICAgICAgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXScpKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBpc1RyYXBFcnJvcihlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuUnVudGltZUVycm9yO1xuICAgIH1cbiAgICBjYXRjaCAoXykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHR5cGUsIHBheWxvYWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgICB9XG4gICAgfTtcbn1cblxudmFyIFdBU0lfVEhSRUFEU19NQVhfVElEID0gMHgxRkZGRkZGRjtcbmZ1bmN0aW9uIGNoZWNrU2hhcmVkV2FzbU1lbW9yeSh3YXNtTWVtb3J5KSB7XG4gICAgaWYgKHdhc21NZW1vcnkpIHtcbiAgICAgICAgaWYgKCFpc1NoYXJlZEFycmF5QnVmZmVyKHdhc21NZW1vcnkuYnVmZmVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXRocmVhZCBmZWF0dXJlcyByZXF1aXJlIHNoYXJlZCB3YXNtIG1lbW9yeS4gJyArXG4gICAgICAgICAgICAgICAgJ1RyeSB0byBjb21waWxlIHdpdGggYC1tYXRvbWljcyAtbWJ1bGstbWVtb3J5YCBhbmQgdXNlIGAtLWltcG9ydC1tZW1vcnkgLS1zaGFyZWQtbWVtb3J5YCBkdXJpbmcgbGlua2luZywgJyArXG4gICAgICAgICAgICAgICAgJ3RoZW4gY3JlYXRlIFdlYkFzc2VtYmx5Lk1lbW9yeSB3aXRoIGBzaGFyZWQ6IHRydWVgIG9wdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgU2hhcmVkQXJyYXlCdWZmZXIsIHRocmVhZHMgYXJlIG5vdCBhdmFpbGFibGUhJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRSZXVzZVdvcmtlcih2YWx1ZSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID8geyBzaXplOiAwLCBzdHJpY3Q6IGZhbHNlIH0gOiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgPj0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdyZXVzZVdvcmtlcjogc2l6ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzaXplOiB2YWx1ZSwgc3RyaWN0OiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHNpemUgPSAoX2EgPSBOdW1iZXIodmFsdWUuc2l6ZSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgdmFyIHN0cmljdCA9IEJvb2xlYW4odmFsdWUuc3RyaWN0KTtcbiAgICBpZiAoIShzaXplID4gMCkgJiYgc3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdyZXVzZVdvcmtlcjogc2l6ZSBtdXN0IGJlIHNldCB0byBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHN0cmljdCBpcyBzZXQgdG8gdHJ1ZScpO1xuICAgIH1cbiAgICByZXR1cm4geyBzaXplOiBzaXplLCBzdHJpY3Q6IHN0cmljdCB9O1xufVxudmFyIG5leHRXb3JrZXJJRCA9IDA7XG4vKiogQHB1YmxpYyAqL1xudmFyIFRocmVhZE1hbmFnZXIgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVGhyZWFkTWFuYWdlcihvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy51bnVzZWRXb3JrZXJzID0gW107XG4gICAgICAgIHRoaXMucnVubmluZ1dvcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5wdGhyZWFkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMud2FzbU1vZHVsZSA9IG51bGw7XG4gICAgICAgIHRoaXMud2FzbU1lbW9yeSA9IG51bGw7XG4gICAgICAgIHRoaXMubWVzc2FnZUV2ZW50cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhyZWFkTWFuYWdlcigpOiBvcHRpb25zIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnY2hpbGRUaHJlYWQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkVGhyZWFkID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkVGhyZWFkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNyZWF0ZVdvcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX3JldXNlV29ya2VyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9iZWZvcmVMb2FkID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25DcmVhdGVXb3JrZXIgPSBvcHRpb25zLm9uQ3JlYXRlV29ya2VyO1xuICAgICAgICAgICAgdGhpcy5fcmV1c2VXb3JrZXIgPSBnZXRSZXVzZVdvcmtlcihvcHRpb25zLnJldXNlV29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuX2JlZm9yZUxvYWQgPSBvcHRpb25zLmJlZm9yZUxvYWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmludEVyciA9IChfYSA9IG9wdGlvbnMucHJpbnRFcnIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRocmVhZE1hbmFnZXIucHJvdG90eXBlLCBcIm5leHRXb3JrZXJJRFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV4dFdvcmtlcklEOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFRocmVhZCkge1xuICAgICAgICAgICAgdGhpcy5pbml0TWFpblRocmVhZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5pbml0TWFpblRocmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlUG9vbCgpO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUucHJlcGFyZVBvb2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JldXNlV29ya2VyLnNpemUpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHRocmVhZFBvb2xTaXplID0gdGhpcy5fcmV1c2VXb3JrZXIuc2l6ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocHRocmVhZFBvb2xTaXplLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IHRoaXMuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNTMwMzZcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vbmNlKCdtZXNzYWdlJywgZnVuY3Rpb24gKCkgeyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5zaG91bGRQcmVsb2FkV29ya2VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9jaGlsZFRocmVhZCAmJiB0aGlzLl9yZXVzZVdvcmtlciAmJiB0aGlzLl9yZXVzZVdvcmtlci5zaXplID4gMDtcbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXNfMSA9IHRoaXM7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IEFycmF5KHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGgpO1xuICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gdGhpc18xLnVudXNlZFdvcmtlcnNbaV07XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSlcbiAgICAgICAgICAgICAgICB3b3JrZXIucmVmKCk7XG4gICAgICAgICAgICBwcm9taXNlc1tpXSA9IHRoaXNfMS5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcikudGhlbihmdW5jdGlvbiAodykge1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKVxuICAgICAgICAgICAgICAgICAgICB3b3JrZXIudW5yZWYoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy51bnVzZWRXb3JrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXNfMS50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUucHJlbG9hZFdvcmtlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFByZWxvYWRXb3JrZXJzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5zZXR1cCA9IGZ1bmN0aW9uICh3YXNtTW9kdWxlLCB3YXNtTWVtb3J5KSB7XG4gICAgICAgIHRoaXMud2FzbU1vZHVsZSA9IHdhc21Nb2R1bGU7XG4gICAgICAgIHRoaXMud2FzbU1lbW9yeSA9IHdhc21NZW1vcnk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5tYXJrSWQgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIGlmICh3b3JrZXIuX19lbW5hcGlfdGlkKVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgIHZhciB0aWQgPSBuZXh0V29ya2VySUQgKyA0MztcbiAgICAgICAgbmV4dFdvcmtlcklEID0gKG5leHRXb3JrZXJJRCArIDEpICUgKFdBU0lfVEhSRUFEU19NQVhfVElEIC0gNDIpO1xuICAgICAgICB0aGlzLnB0aHJlYWRzW3RpZF0gPSB3b3JrZXI7XG4gICAgICAgIHdvcmtlci5fX2VtbmFwaV90aWQgPSB0aWQ7XG4gICAgICAgIHJldHVybiB0aWQ7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5yZXR1cm5Xb3JrZXJUb1Bvb2wgPSBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICBpZiAodGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnB0aHJlYWRzW3RpZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgdGhpcy5ydW5uaW5nV29ya2Vycy5zcGxpY2UodGhpcy5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksIDEpO1xuICAgICAgICBkZWxldGUgd29ya2VyLl9fZW1uYXBpX3RpZDtcbiAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5sb2FkV2FzbU1vZHVsZVRvV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlciwgc2FiKSB7XG4gICAgICAgIHZhciBfdGhpc18xID0gdGhpcztcbiAgICAgICAgaWYgKHdvcmtlci53aGVuTG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtlci53aGVuTG9hZGVkO1xuICAgICAgICB2YXIgZXJyID0gdGhpcy5wcmludEVycjtcbiAgICAgICAgdmFyIGJlZm9yZUxvYWQgPSB0aGlzLl9iZWZvcmVMb2FkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgd29ya2VyLndoZW5Mb2FkZWQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gJ3dvcmtlciBzZW50IGFuIGVycm9yISc7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlci5fX2VtbmFwaV90aWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ3dvcmtlciAodGlkID0gJyArIHdvcmtlci5fX2VtbmFwaV90aWQgKyAnKSBzZW50IGFuIGVycm9yISc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycihtZXNzYWdlICsgJyAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBpZiAoZS5tZXNzYWdlLmluZGV4T2YoJ1J1bnRpbWVFcnJvcicpICE9PSAtMSB8fCBlLm1lc3NhZ2UuaW5kZXhPZigndW5yZWFjaGFibGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBoYW5kbGVNZXNzYWdlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5fX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5fX2VtbmFwaV9fLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gZGF0YS5fX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSAmJiAhd29ya2VyLl9fZW1uYXBpX3RpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci51bnJlZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh3b3JrZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHBheWxvYWQuZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycignZmFpbGVkIHRvIGxvYWQgaW4gY2hpbGQgdGhyZWFkOiAnICsgKHBheWxvYWQuZXJyLm1lc3NhZ2UgfHwgcGF5bG9hZC5lcnIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdjbGVhbnVwLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLnRpZCBpbiBfdGhpc18xLnB0aHJlYWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXNfMS5jbGVhblRocmVhZCh3b3JrZXIsIHBheWxvYWQudGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNZXNzYWdlKGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgX3RoaXNfMS5maXJlTWVzc2FnZUV2ZW50KHdvcmtlciwgZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBoYW5kbGVFcnJvcjtcbiAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICAgICAgKF9iID0gKF9hID0gd29ya2VyKS5vbm1lc3NhZ2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHdvcmtlci5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgICAgICAoX2IgPSAoX2EgPSB3b3JrZXIpLm9uZXJyb3IpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXIub24oJ2RldGFjaGVkRXhpdCcsIGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJlZm9yZUxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmVMb2FkKHdvcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCdsb2FkJywge1xuICAgICAgICAgICAgICAgICAgICB3YXNtTW9kdWxlOiBfdGhpc18xLndhc21Nb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnk6IF90aGlzXzEud2FzbU1lbW9yeSxcbiAgICAgICAgICAgICAgICAgICAgc2FiOiBzYWJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tTaGFyZWRXYXNtTWVtb3J5KF90aGlzXzEud2FzbU1lbW9yeSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdvcmtlci53aGVuTG9hZGVkO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuYWxsb2NhdGVVbnVzZWRXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfb25DcmVhdGVXb3JrZXIgPSB0aGlzLl9vbkNyZWF0ZVdvcmtlcjtcbiAgICAgICAgaWYgKHR5cGVvZiBfb25DcmVhdGVXb3JrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BvcHRpb25zLm9uQ3JlYXRlV29ya2VyYCBpcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd29ya2VyID0gX29uQ3JlYXRlV29ya2VyKHsgdHlwZTogJ3RocmVhZCcsIG5hbWU6ICdlbW5hcGktcHRocmVhZCcgfSk7XG4gICAgICAgIHRoaXMudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5nZXROZXdXb3JrZXIgPSBmdW5jdGlvbiAoc2FiKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgaWYgKHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmV1c2VXb3JrZXIuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHRoaXMucHJpbnRFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoJ1RyaWVkIHRvIHNwYXduIGEgbmV3IHRocmVhZCwgYnV0IHRoZSB0aHJlYWQgcG9vbCBpcyBleGhhdXN0ZWQuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgbWlnaHQgcmVzdWx0IGluIGEgZGVhZGxvY2sgdW5sZXNzIHNvbWUgdGhyZWFkcyBldmVudHVhbGx5IGV4aXQgb3IgdGhlIGNvZGUgZXhwbGljaXRseSBicmVha3Mgb3V0IHRvIHRoZSBldmVudCBsb29wLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB3b3JrZXJfMSA9IHRoaXMuYWxsb2NhdGVVbnVzZWRXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcl8xLCBzYWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudW51c2VkV29ya2Vycy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd29ya2VyID0gdGhpcy5hbGxvY2F0ZVVudXNlZFdvcmtlcigpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHRoaXMubG9hZFdhc21Nb2R1bGVUb1dvcmtlcih3b3JrZXIsIHNhYik7XG4gICAgICAgIHJldHVybiB0aGlzLnVudXNlZFdvcmtlcnMucG9wKCk7XG4gICAgfTtcbiAgICBUaHJlYWRNYW5hZ2VyLnByb3RvdHlwZS5jbGVhblRocmVhZCA9IGZ1bmN0aW9uICh3b3JrZXIsIHRpZCwgZm9yY2UpIHtcbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLl9yZXVzZVdvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5yZXR1cm5Xb3JrZXJUb1Bvb2wod29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnB0aHJlYWRzW3RpZF07XG4gICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLnJ1bm5pbmdXb3JrZXJzLmluZGV4T2Yod29ya2VyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5pbmdXb3JrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZVdvcmtlcih3b3JrZXIpO1xuICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fX2VtbmFwaV90aWQ7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLnRlcm1pbmF0ZVdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgdmFyIF90aGlzXzEgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciB0aWQgPSB3b3JrZXIuX19lbW5hcGlfdGlkO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgKF9hID0gdGhpcy5tZXNzYWdlRXZlbnRzLmdldCh3b3JrZXIpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlRXZlbnRzLmRlbGV0ZSh3b3JrZXIpO1xuICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmRhdGEuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgICAgIHZhciBlcnIgPSBfdGhpc18xLnByaW50RXJyO1xuICAgICAgICAgICAgICAgIGVycigncmVjZWl2ZWQgXCInICsgZS5kYXRhLl9fZW1uYXBpX18udHlwZSArICdcIiBjb21tYW5kIGZyb20gdGVybWluYXRlZCB3b3JrZXI6ICcgKyB0aWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUudGVybWluYXRlQWxsVGhyZWFkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJ1bm5pbmdXb3JrZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZVdvcmtlcih0aGlzLnJ1bm5pbmdXb3JrZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudW51c2VkV29ya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVXb3JrZXIodGhpcy51bnVzZWRXb3JrZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVudXNlZFdvcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ydW5uaW5nV29ya2VycyA9IFtdO1xuICAgICAgICB0aGlzLnB0aHJlYWRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlUG9vbCgpO1xuICAgIH07XG4gICAgVGhyZWFkTWFuYWdlci5wcm90b3R5cGUuYWRkTWVzc2FnZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAod29ya2VyLCBvbk1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMubWVzc2FnZUV2ZW50cy5nZXQod29ya2VyKTtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUV2ZW50cy5zZXQod29ya2VyLCBsaXN0ZW5lcnMpO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVycy5hZGQob25NZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycyA9PT0gbnVsbCB8fCBsaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxpc3RlbmVycy5kZWxldGUob25NZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRocmVhZE1hbmFnZXIucHJvdG90eXBlLmZpcmVNZXNzYWdlRXZlbnQgPSBmdW5jdGlvbiAod29ya2VyLCBlKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLm1lc3NhZ2VFdmVudHMuZ2V0KHdvcmtlcik7XG4gICAgICAgIGlmICghbGlzdGVuZXJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZXJyID0gdGhpcy5wcmludEVycjtcbiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBlcnIoZS5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIFRocmVhZE1hbmFnZXI7XG59KCkpO1xuXG52YXIga0lzUHJveHkgPSBTeW1ib2woJ2tJc1Byb3h5Jyk7XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VQcm94eShpbnN0YW5jZSwgbWVtb3J5KSB7XG4gICAgaWYgKGluc3RhbmNlW2tJc1Byb3h5XSlcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvaGVscC9pc3N1ZXMvNDEwMlxuICAgIHZhciBvcmlnaW5hbEV4cG9ydHMgPSBpbnN0YW5jZS5leHBvcnRzO1xuICAgIHZhciBjcmVhdGVIYW5kbGVyID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSBbXG4gICAgICAgICAgICAnYXBwbHknLFxuICAgICAgICAgICAgJ2NvbnN0cnVjdCcsXG4gICAgICAgICAgICAnZGVmaW5lUHJvcGVydHknLFxuICAgICAgICAgICAgJ2RlbGV0ZVByb3BlcnR5JyxcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsXG4gICAgICAgICAgICAnZ2V0UHJvdG90eXBlT2YnLFxuICAgICAgICAgICAgJ2hhcycsXG4gICAgICAgICAgICAnaXNFeHRlbnNpYmxlJyxcbiAgICAgICAgICAgICdvd25LZXlzJyxcbiAgICAgICAgICAgICdwcmV2ZW50RXh0ZW5zaW9ucycsXG4gICAgICAgICAgICAnc2V0JyxcbiAgICAgICAgICAgICdzZXRQcm90b3R5cGVPZidcbiAgICAgICAgXTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB7fTtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgdmFyIG5hbWVfMSA9IGhhbmRsZXJzW2ldO1xuICAgICAgICAgICAgaGFuZGxlcltuYW1lXzFdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgICAgICAgICBhcmdzLnVuc2hpZnQodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdFtuYW1lXzFdLmFwcGx5KFJlZmxlY3QsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgX2xvb3BfMShpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9O1xuICAgIHZhciBoYW5kbGVyID0gY3JlYXRlSGFuZGxlcihvcmlnaW5hbEV4cG9ydHMpO1xuICAgIHZhciBfaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICB2YXIgX3N0YXJ0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfTtcbiAgICBoYW5kbGVyLmdldCA9IGZ1bmN0aW9uIChfdGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwID09PSAnbWVtb3J5Jykge1xuICAgICAgICAgICAgcmV0dXJuIChfYSA9ICh0eXBlb2YgbWVtb3J5ID09PSAnZnVuY3Rpb24nID8gbWVtb3J5KCkgOiBtZW1vcnkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBSZWZsZWN0LmdldChvcmlnaW5hbEV4cG9ydHMsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocCA9PT0gJ19pbml0aWFsaXplJykge1xuICAgICAgICAgICAgcmV0dXJuIHAgaW4gb3JpZ2luYWxFeHBvcnRzID8gX2luaXRpYWxpemUgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAgPT09ICdfc3RhcnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcCBpbiBvcmlnaW5hbEV4cG9ydHMgPyBfc3RhcnQgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9yaWdpbmFsRXhwb3J0cywgcCwgcmVjZWl2ZXIpO1xuICAgIH07XG4gICAgaGFuZGxlci5oYXMgPSBmdW5jdGlvbiAoX3RhcmdldCwgcCkge1xuICAgICAgICBpZiAocCA9PT0gJ21lbW9yeScpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuaGFzKG9yaWdpbmFsRXhwb3J0cywgcCk7XG4gICAgfTtcbiAgICB2YXIgZXhwb3J0c1Byb3h5ID0gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCksIGhhbmRsZXIpO1xuICAgIHJldHVybiBuZXcgUHJveHkoaW5zdGFuY2UsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBwLCByZWNlaXZlcikge1xuICAgICAgICAgICAgaWYgKHAgPT09ICdleHBvcnRzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzUHJveHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocCA9PT0ga0lzUHJveHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG52YXIgcGF0Y2hlZFdhc2lJbnN0YW5jZXMgPSBuZXcgV2Vha01hcCgpO1xuLyoqIEBwdWJsaWMgKi9cbnZhciBXQVNJVGhyZWFkcyA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXQVNJVGhyZWFkcyhvcHRpb25zKSB7XG4gICAgICAgIHZhciBfdGhpc18xID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXQVNJVGhyZWFkcygpOiBvcHRpb25zIGlzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy53YXNpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdXQVNJVGhyZWFkcygpOiBvcHRpb25zLndhc2kgaXMgbm90IHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hlZFdhc2lJbnN0YW5jZXMuc2V0KHRoaXMsIG5ldyBXZWFrU2V0KCkpO1xuICAgICAgICB2YXIgd2FzaSA9IG9wdGlvbnMud2FzaTtcbiAgICAgICAgcGF0Y2hXYXNpSW5zdGFuY2UodGhpcywgd2FzaSk7XG4gICAgICAgIHRoaXMud2FzaSA9IHdhc2k7XG4gICAgICAgIGlmICgnY2hpbGRUaHJlYWQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRUaHJlYWQgPSBCb29sZWFuKG9wdGlvbnMuY2hpbGRUaHJlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jaGlsZFRocmVhZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuUFRocmVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCd0aHJlYWRNYW5hZ2VyJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudGhyZWFkTWFuYWdlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuUFRocmVhZCA9IG9wdGlvbnMudGhyZWFkTWFuYWdlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkID0gb3B0aW9ucy50aHJlYWRNYW5hZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkID0gbmV3IFRocmVhZE1hbmFnZXIob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5QVGhyZWFkLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FpdFRocmVhZFN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIGlmICgnd2FpdFRocmVhZFN0YXJ0JyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICB3YWl0VGhyZWFkU3RhcnQgPSB0eXBlb2Ygb3B0aW9ucy53YWl0VGhyZWFkU3RhcnQgPT09ICdudW1iZXInID8gb3B0aW9ucy53YWl0VGhyZWFkU3RhcnQgOiBCb29sZWFuKG9wdGlvbnMud2FpdFRocmVhZFN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcG9zdE1lc3NhZ2UgPSBnZXRQb3N0TWVzc2FnZShvcHRpb25zKTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQgJiYgdHlwZW9mIHBvc3RNZXNzYWdlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLnBvc3RNZXNzYWdlIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3N0TWVzc2FnZSA9IHBvc3RNZXNzYWdlO1xuICAgICAgICB2YXIgd2FzbTY0ID0gQm9vbGVhbihvcHRpb25zLndhc202NCk7XG4gICAgICAgIHZhciBvbk1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKGUuZGF0YS5fX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlLmRhdGEuX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gZS5kYXRhLl9fZW1uYXBpX18ucGF5bG9hZDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NwYXduLXRocmVhZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3Bhd24ocGF5bG9hZC5zdGFydEFyZywgcGF5bG9hZC5lcnJvck9yVGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ3Rlcm1pbmF0ZS1hbGwtdGhyZWFkcycpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXNfMS50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgdGhyZWFkU3Bhd24gPSBmdW5jdGlvbiAoc3RhcnRBcmcsIGVycm9yT3JUaWQpIHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHZhciBFQUdBSU4gPSA2O1xuICAgICAgICAgICAgdmFyIGlzTmV3QUJJID0gZXJyb3JPclRpZCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGVja1NoYXJlZFdhc21NZW1vcnkoX3RoaXNfMS53YXNtTWVtb3J5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAoX2EgPSBfdGhpc18xLlBUaHJlYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wcmludEVycihlcnIuc3RhY2spO1xuICAgICAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RydWN0XzEgPSBuZXcgSW50MzJBcnJheShfdGhpc18xLndhc21NZW1vcnkuYnVmZmVyLCBlcnJvck9yVGlkLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3RfMSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0XzEsIDEsIEVBR0FJTik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Mubm90aWZ5KHN0cnVjdF8xLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgIHZhciBtYWxsb2MgPSBfdGhpc18xLndhc21JbnN0YW5jZS5leHBvcnRzLm1hbGxvYztcbiAgICAgICAgICAgICAgICBlcnJvck9yVGlkID0gd2FzbTY0ID8gTnVtYmVyKG1hbGxvYyhCaWdJbnQoOCkpKSA6IG1hbGxvYyg4KTtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yT3JUaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC00ODsgLyogRU5PTUVNICovXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF9mcmVlID0gX3RoaXNfMS53YXNtSW5zdGFuY2UuZXhwb3J0cy5mcmVlO1xuICAgICAgICAgICAgdmFyIGZyZWUgPSB3YXNtNjQgPyBmdW5jdGlvbiAocHRyKSB7IF9mcmVlKEJpZ0ludChwdHIpKTsgfSA6IF9mcmVlO1xuICAgICAgICAgICAgdmFyIHN0cnVjdCA9IG5ldyBJbnQzMkFycmF5KF90aGlzXzEud2FzbU1lbW9yeS5idWZmZXIsIGVycm9yT3JUaWQsIDIpO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIDApO1xuICAgICAgICAgICAgaWYgKF90aGlzXzEuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCdzcGF3bi10aHJlYWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0QXJnOiBzdGFydEFyZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JPclRpZDogZXJyb3JPclRpZFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoc3RydWN0LCAxLCAwKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNFcnJvciA9IEF0b21pY3MubG9hZChzdHJ1Y3QsIDApO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBBdG9taWNzLmxvYWQoc3RydWN0LCAxKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdBQkkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXJyb3IgPyAtcmVzdWx0IDogcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHNob3VsZFdhaXQgPSB3YWl0VGhyZWFkU3RhcnQgfHwgKHdhaXRUaHJlYWRTdGFydCA9PT0gMCk7XG4gICAgICAgICAgICB2YXIgc2FiO1xuICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICBzYWIgPSBuZXcgSW50MzJBcnJheShuZXcgU2hhcmVkQXJyYXlCdWZmZXIoMTYgKyA4MTkyKSk7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzYWIsIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdvcmtlcjtcbiAgICAgICAgICAgIHZhciB0aWQ7XG4gICAgICAgICAgICB2YXIgUFRocmVhZCA9IF90aGlzXzEuUFRocmVhZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd29ya2VyID0gUFRocmVhZC5nZXROZXdXb3JrZXIoc2FiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgbmV3IHdvcmtlcicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBQVGhyZWFkLmFkZE1lc3NhZ2VFdmVudExpc3RlbmVyKHdvcmtlciwgb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aWQgPSBQVGhyZWFkLm1hcmtJZCh3b3JrZXIpO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZWYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoJ3N0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICB0aWQ6IHRpZCxcbiAgICAgICAgICAgICAgICAgICAgYXJnOiBzdGFydEFyZyxcbiAgICAgICAgICAgICAgICAgICAgc2FiOiBzYWJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YWl0VGhyZWFkU3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdFJlc3VsdCA9IEF0b21pY3Mud2FpdChzYWIsIDAsIDAsIHdhaXRUaHJlYWRTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFJlc3VsdCA9PT0gJ3RpbWVkLW91dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLmNsZWFuVGhyZWFkKHdvcmtlciwgdGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3Bhd25pbmcgdGhyZWFkIHRpbWVkIG91dC4gUGxlYXNlIGNoZWNrIGlmIHRoZSB3b3JrZXIgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIG1lc3NhZ2UgaXMgaGFuZGxlZCBwcm9wZXJseSBpbiB0aGUgd29ya2VyLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy53YWl0KHNhYiwgMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBBdG9taWNzLmxvYWQoc2FiLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUaHJlYWQuY2xlYW5UaHJlYWQod29ya2VyLCB0aWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGVzZXJpemVFcnJvckZyb21CdWZmZXIoc2FiLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoc3RydWN0LCAwLCAxKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKHN0cnVjdCwgMSwgRUFHQUlOKTtcbiAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgICAgIFBUaHJlYWQgPT09IG51bGwgfHwgUFRocmVhZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogUFRocmVhZC5wcmludEVycihlLnN0YWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdBQkkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyZWUoZXJyb3JPclRpZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC02O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDAsIDApO1xuICAgICAgICAgICAgQXRvbWljcy5zdG9yZShzdHJ1Y3QsIDEsIHRpZCk7XG4gICAgICAgICAgICBBdG9taWNzLm5vdGlmeShzdHJ1Y3QsIDEpO1xuICAgICAgICAgICAgUFRocmVhZC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICBpZiAoIXNob3VsZFdhaXQpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXIud2hlbkxvYWRlZC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIud2hlbkxvYWRlZDtcbiAgICAgICAgICAgICAgICAgICAgUFRocmVhZC5jbGVhblRocmVhZCh3b3JrZXIsIHRpZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05ld0FCSSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnJlZShlcnJvck9yVGlkKTtcbiAgICAgICAgICAgIHJldHVybiB0aWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudGhyZWFkU3Bhd24gPSB0aHJlYWRTcGF3bjtcbiAgICB9XG4gICAgV0FTSVRocmVhZHMucHJvdG90eXBlLmdldEltcG9ydE9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdhc2k6IHtcbiAgICAgICAgICAgICAgICAndGhyZWFkLXNwYXduJzogdGhpcy50aHJlYWRTcGF3blxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH07XG4gICAgV0FTSVRocmVhZHMucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24gKHdhc21JbnN0YW5jZSwgd2FzbU1vZHVsZSwgd2FzbU1lbW9yeSkge1xuICAgICAgICB3YXNtTWVtb3J5ICE9PSBudWxsICYmIHdhc21NZW1vcnkgIT09IHZvaWQgMCA/IHdhc21NZW1vcnkgOiAod2FzbU1lbW9yeSA9IHdhc21JbnN0YW5jZS5leHBvcnRzLm1lbW9yeSk7XG4gICAgICAgIHRoaXMud2FzbUluc3RhbmNlID0gd2FzbUluc3RhbmNlO1xuICAgICAgICB0aGlzLndhc21NZW1vcnkgPSB3YXNtTWVtb3J5O1xuICAgICAgICBpZiAodGhpcy5QVGhyZWFkKSB7XG4gICAgICAgICAgICB0aGlzLlBUaHJlYWQuc2V0dXAod2FzbU1vZHVsZSwgd2FzbU1lbW9yeSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFdBU0lUaHJlYWRzLnByb3RvdHlwZS5wcmVsb2FkV29ya2VycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuUFRocmVhZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuUFRocmVhZC5wcmVsb2FkV29ya2VycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogSXQncyBvayB0byBjYWxsIHRoaXMgbWV0aG9kIHRvIGEgV0FTSSBjb21tYW5kIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIGluIGNoaWxkIHRocmVhZCwgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGluc3RlYWQgb2Yge0BsaW5rIFdBU0lUaHJlYWRzLnN0YXJ0fSBldmVuIGlmIGl0J3MgYSBXQVNJIGNvbW1hbmQgbW9kdWxlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHByb3hpZWQgV2ViQXNzZW1ibHkgaW5zdGFuY2UgaWYgaW4gY2hpbGQgdGhyZWFkLCBvdGhlciB3aXNlIHRoZSBvcmlnaW5hbCBpbnN0YW5jZVxuICAgICAqL1xuICAgIFdBU0lUaHJlYWRzLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24gKGluc3RhbmNlLCBtb2R1bGUsIG1lbW9yeSkge1xuICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7XG4gICAgICAgIG1lbW9yeSAhPT0gbnVsbCAmJiBtZW1vcnkgIT09IHZvaWQgMCA/IG1lbW9yeSA6IChtZW1vcnkgPSBleHBvcnRzLm1lbW9yeSk7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlUHJveHkoaW5zdGFuY2UsIG1lbW9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cChpbnN0YW5jZSwgbW9kdWxlLCBtZW1vcnkpO1xuICAgICAgICB2YXIgd2FzaSA9IHRoaXMud2FzaTtcbiAgICAgICAgaWYgKCgnX3N0YXJ0JyBpbiBleHBvcnRzKSAmJiAodHlwZW9mIGV4cG9ydHMuX3N0YXJ0ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgICAgICB3YXNpLnN0YXJ0KGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga1N0YXJ0ZWQgPSBnZXRXYXNpU3ltYm9sKHdhc2ksICdrU3RhcnRlZCcpO1xuICAgICAgICAgICAgICAgICAgICB3YXNpW2tTdGFydGVkXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXR1cEluc3RhbmNlKHdhc2ksIGluc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdhc2kuaW5pdGlhbGl6ZShpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIHtAbGluayBXQVNJVGhyZWFkcy5pbml0aWFsaXplfSBhbmQgdGhlbiBjYWxsaW5nIHtAbGluayBXQVNJSW5zdGFuY2Uuc3RhcnR9XG4gICAgICogYGBganNcbiAgICAgKiB0aGlzLmluaXRpYWxpemUoaW5zdGFuY2UsIG1vZHVsZSwgbWVtb3J5KVxuICAgICAqIHRoaXMud2FzaS5zdGFydChpbnN0YW5jZSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBXQVNJVGhyZWFkcy5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIG1vZHVsZSwgbWVtb3J5KSB7XG4gICAgICAgIHZhciBleHBvcnRzID0gaW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgbWVtb3J5ICE9PSBudWxsICYmIG1lbW9yeSAhPT0gdm9pZCAwID8gbWVtb3J5IDogKG1lbW9yeSA9IGV4cG9ydHMubWVtb3J5KTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2VQcm94eShpbnN0YW5jZSwgbWVtb3J5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldHVwKGluc3RhbmNlLCBtb2R1bGUsIG1lbW9yeSk7XG4gICAgICAgIHZhciBleGl0Q29kZSA9IHRoaXMud2FzaS5zdGFydChpbnN0YW5jZSk7XG4gICAgICAgIHJldHVybiB7IGV4aXRDb2RlOiBleGl0Q29kZSwgaW5zdGFuY2U6IGluc3RhbmNlIH07XG4gICAgfTtcbiAgICBXQVNJVGhyZWFkcy5wcm90b3R5cGUudGVybWluYXRlQWxsVGhyZWFkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuY2hpbGRUaHJlYWQpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMuUFRocmVhZCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZSgndGVybWluYXRlLWFsbC10aHJlYWRzJywge30pKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFdBU0lUaHJlYWRzO1xufSgpKTtcbmZ1bmN0aW9uIHBhdGNoV2FzaUluc3RhbmNlKHdhc2lUaHJlYWRzLCB3YXNpKSB7XG4gICAgdmFyIHBhdGNoZWQgPSBwYXRjaGVkV2FzaUluc3RhbmNlcy5nZXQod2FzaVRocmVhZHMpO1xuICAgIGlmIChwYXRjaGVkLmhhcyh3YXNpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBfdGhpcyA9IHdhc2lUaHJlYWRzO1xuICAgIHZhciB3YXNpSW1wb3J0ID0gd2FzaS53YXNpSW1wb3J0O1xuICAgIGlmICh3YXNpSW1wb3J0KSB7XG4gICAgICAgIHZhciBwcm9jX2V4aXRfMSA9IHdhc2lJbXBvcnQucHJvY19leGl0O1xuICAgICAgICB3YXNpSW1wb3J0LnByb2NfZXhpdCA9IGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgICAgICBfdGhpcy50ZXJtaW5hdGVBbGxUaHJlYWRzKCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY19leGl0XzEuY2FsbCh0aGlzLCBjb2RlKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gd2FzaS5zdGFydDtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhc2kuc3RhcnQgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0LmNhbGwodGhpcywgaW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc1RyYXBFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRlcm1pbmF0ZUFsbFRocmVhZHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBwYXRjaGVkLmFkZCh3YXNpKTtcbn1cbmZ1bmN0aW9uIGdldFdhc2lTeW1ib2wod2FzaSwgZGVzY3JpcHRpb24pIHtcbiAgICB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMod2FzaSk7XG4gICAgdmFyIHNlbGVjdERlc2NyaXB0aW9uID0gZnVuY3Rpb24gKGRlc2NyaXB0aW9uKSB7IHJldHVybiBmdW5jdGlvbiAocykge1xuICAgICAgICBpZiAocy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHMuZGVzY3JpcHRpb24gPT09IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCkgPT09IFwiU3ltYm9sKFwiLmNvbmNhdChkZXNjcmlwdGlvbiwgXCIpXCIpO1xuICAgIH07IH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzY3JpcHRpb24pKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHN5bWJvbHMuZmlsdGVyKHNlbGVjdERlc2NyaXB0aW9uKGQpKVswXTsgfSk7XG4gICAgfVxuICAgIHJldHVybiBzeW1ib2xzLmZpbHRlcihzZWxlY3REZXNjcmlwdGlvbihkZXNjcmlwdGlvbikpWzBdO1xufVxuZnVuY3Rpb24gc2V0dXBJbnN0YW5jZSh3YXNpLCBpbnN0YW5jZSkge1xuICAgIHZhciBfYSA9IGdldFdhc2lTeW1ib2wod2FzaSwgWydrSW5zdGFuY2UnLCAna1NldE1lbW9yeSddKSwga0luc3RhbmNlID0gX2FbMF0sIGtTZXRNZW1vcnkgPSBfYVsxXTtcbiAgICB3YXNpW2tJbnN0YW5jZV0gPSBpbnN0YW5jZTtcbiAgICB3YXNpW2tTZXRNZW1vcnldKGluc3RhbmNlLmV4cG9ydHMubWVtb3J5KTtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbnZhciBUaHJlYWRNZXNzYWdlSGFuZGxlciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUaHJlYWRNZXNzYWdlSGFuZGxlcihvcHRpb25zKSB7XG4gICAgICAgIHZhciBwb3N0TXNnID0gZ2V0UG9zdE1lc3NhZ2Uob3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zdE1zZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5wb3N0TWVzc2FnZSBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9zdE1lc3NhZ2UgPSBwb3N0TXNnO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vbkxvYWQ7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHRoaXMubW9kdWxlID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgfVxuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5pbnN0YW50aWF0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vbkxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9uTG9hZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5pbnN0YW50aWF0ZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUuZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZS5kYXRhLl9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgIHZhciBwYXlsb2FkXzEgPSBlLmRhdGEuX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdsb2FkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWQocGF5bG9hZF8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdzdGFydCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFmdGVyTG9hZChlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zdGFydChwYXlsb2FkXzEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX2xvYWQgPSBmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgc291cmNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc291cmNlID0gdGhpcy5pbnN0YW50aWF0ZShwYXlsb2FkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQoZXJyLCBudWxsLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhlbiA9IHNvdXJjZSAmJiAndGhlbicgaW4gc291cmNlID8gc291cmNlLnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgdGhlbi5jYWxsKHNvdXJjZSwgZnVuY3Rpb24gKHNvdXJjZSkgeyBfdGhpcy5fbG9hZGVkKG51bGwsIHNvdXJjZSwgcGF5bG9hZCk7IH0sIGZ1bmN0aW9uIChlcnIpIHsgX3RoaXMuX2xvYWRlZChlcnIsIG51bGwsIHBheWxvYWQpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZChudWxsLCBzb3VyY2UsIHBheWxvYWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCd3YXNpX3RocmVhZF9zdGFydCBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgIG5vdGlmeVB0aHJlYWRDcmVhdGVSZXN1bHQocGF5bG9hZC5zYWIsIDIsIGVycik7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gdGhpcy5wb3N0TWVzc2FnZTtcbiAgICAgICAgdmFyIHRpZCA9IHBheWxvYWQudGlkO1xuICAgICAgICB2YXIgc3RhcnRBcmcgPSBwYXlsb2FkLmFyZztcbiAgICAgICAgbm90aWZ5UHRocmVhZENyZWF0ZVJlc3VsdChwYXlsb2FkLnNhYiwgMSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmV4cG9ydHMud2FzaV90aHJlYWRfc3RhcnQodGlkLCBzdGFydEFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGlzVHJhcEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShjcmVhdGVNZXNzYWdlKCd0ZXJtaW5hdGUtYWxsLXRocmVhZHMnLCB7fSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHBvc3RNZXNzYWdlKGNyZWF0ZU1lc3NhZ2UoJ2NsZWFudXAtdGhyZWFkJywgeyB0aWQ6IHRpZCB9KSk7XG4gICAgfTtcbiAgICBUaHJlYWRNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuX2xvYWRlZCA9IGZ1bmN0aW9uIChlcnIsIHNvdXJjZSwgcGF5bG9hZCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHBheWxvYWQuc2FiLCAyLCBlcnIpO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGVycl8xID0gbmV3IFR5cGVFcnJvcignb25Mb2FkIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0Jyk7XG4gICAgICAgICAgICBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHBheWxvYWQuc2FiLCAyLCBlcnJfMSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJfMTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5zdGFuY2UgPSBzb3VyY2UuaW5zdGFuY2U7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHZhciBlcnJfMiA9IG5ldyBUeXBlRXJyb3IoJ29uTG9hZCBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBpbmNsdWRlcyBcImluc3RhbmNlXCInKTtcbiAgICAgICAgICAgIG5vdGlmeVB0aHJlYWRDcmVhdGVSZXN1bHQocGF5bG9hZC5zYWIsIDIsIGVycl8yKTtcbiAgICAgICAgICAgIHRocm93IGVycl8yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgdmFyIHBvc3RNZXNzYWdlID0gdGhpcy5wb3N0TWVzc2FnZTtcbiAgICAgICAgcG9zdE1lc3NhZ2UoY3JlYXRlTWVzc2FnZSgnbG9hZGVkJywge30pKTtcbiAgICAgICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlc0JlZm9yZUxvYWQ7XG4gICAgICAgIHRoaXMubWVzc2FnZXNCZWZvcmVMb2FkID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gbWVzc2FnZXNbaV07XG4gICAgICAgICAgICB0aGlzLmhhbmRsZSh7IGRhdGE6IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRocmVhZE1lc3NhZ2VIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVBZnRlckxvYWQgPSBmdW5jdGlvbiAoZSwgZikge1xuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzQmVmb3JlTG9hZC5wdXNoKGUuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBUaHJlYWRNZXNzYWdlSGFuZGxlcjtcbn0oKSk7XG5mdW5jdGlvbiBub3RpZnlQdGhyZWFkQ3JlYXRlUmVzdWx0KHNhYiwgcmVzdWx0LCBlcnJvcikge1xuICAgIGlmIChzYWIpIHtcbiAgICAgICAgc2VyaXplRXJyb3JUb0J1ZmZlcihzYWIuYnVmZmVyLCByZXN1bHQsIGVycm9yKTtcbiAgICAgICAgQXRvbWljcy5ub3RpZnkoc2FiLCAwKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFRocmVhZE1hbmFnZXIsIFRocmVhZE1lc3NhZ2VIYW5kbGVyLCBXQVNJVGhyZWFkcywgY3JlYXRlSW5zdGFuY2VQcm94eSwgaXNTaGFyZWRBcnJheUJ1ZmZlciwgaXNUcmFwRXJyb3IgfTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsImltcG9ydCB7IFRocmVhZE1hbmFnZXIsIFdBU0lUaHJlYWRzLCBUaHJlYWRNZXNzYWdlSGFuZGxlciB9IGZyb20gJ0BlbW5hcGkvd2FzaS10aHJlYWRzJztcbmV4cG9ydCAqIGZyb20gJ0BlbW5hcGkvd2FzaS10aHJlYWRzJztcbmltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gJ3RzbGliJztcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbnZhciBfV2ViQXNzZW1ibHkgPSB0eXBlb2YgV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgPyBXZWJBc3NlbWJseVxuICAgIDogdHlwZW9mIFdYV2ViQXNzZW1ibHkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gV1hXZWJBc3NlbWJseVxuICAgICAgICA6IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKSB7XG4gICAgaWYgKGltcG9ydHMgJiYgdHlwZW9mIGltcG9ydHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ltcG9ydHMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gbG9hZCh3YXNtSW5wdXQsIGltcG9ydHMpIHtcbiAgICBpZiAoIXdhc21JbnB1dClcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xuICAgIHZhbGlkYXRlSW1wb3J0cyhpbXBvcnRzKTtcbiAgICBpbXBvcnRzID0gaW1wb3J0cyAhPT0gbnVsbCAmJiBpbXBvcnRzICE9PSB2b2lkIDAgPyBpbXBvcnRzIDoge307XG4gICAgLy8gUHJvbWlzZTxzdHJpbmcgfCBVUkwgfCBSZXNwb25zZSB8IEJ1ZmZlclNvdXJjZSB8IFdlYkFzc2VtYmx5Lk1vZHVsZT5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdGhlbiA9IHR5cGVvZiB3YXNtSW5wdXQgPT09ICdvYmplY3QnICYmIHdhc21JbnB1dCAhPT0gbnVsbCAmJiAndGhlbicgaW4gd2FzbUlucHV0ID8gd2FzbUlucHV0LnRoZW4gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoZW4uY2FsbCh3YXNtSW5wdXQsIGZ1bmN0aW9uIChpbnB1dCkgeyByZXR1cm4gbG9hZChpbnB1dCwgaW1wb3J0cyk7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChfKSB7IH1cbiAgICAvLyBCdWZmZXJTb3VyY2VcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgIH1cbiAgICAvLyBXZWJBc3NlbWJseS5Nb2R1bGVcbiAgICBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgX1dlYkFzc2VtYmx5Lk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKHdhc21JbnB1dCwgaW1wb3J0cykudGhlbihmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiB3YXNtSW5wdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFJlc3BvbnNlXG4gICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHdhc21JbnB1dC5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZShidWZmZXIsIGltcG9ydHMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gc3RyaW5nIHwgVVJMXG4gICAgdmFyIGlucHV0SXNTdHJpbmcgPSB0eXBlb2Ygd2FzbUlucHV0ID09PSAnc3RyaW5nJztcbiAgICBpZiAoaW5wdXRJc1N0cmluZyB8fCAodHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcgJiYgd2FzbUlucHV0IGluc3RhbmNlb2YgVVJMKSkge1xuICAgICAgICBpZiAoaW5wdXRJc1N0cmluZyAmJiB0eXBlb2Ygd3ggIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX3d4Q29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZSh3YXNtSW5wdXQsIGltcG9ydHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZmV0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dhc20gc291cmNlIGNhbiBub3QgYmUgYSBzdHJpbmcgb3IgVVJMIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1dlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2FkKGZldGNoKHdhc21JbnB1dCksIGltcG9ydHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxvYWQoZmV0Y2god2FzbUlucHV0KSwgaW1wb3J0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIHNvdXJjZScpO1xufVxuZnVuY3Rpb24gbG9hZFN5bmMod2FzbUlucHV0LCBpbXBvcnRzKSB7XG4gICAgaWYgKCF3YXNtSW5wdXQpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB2YWxpZGF0ZUltcG9ydHMoaW1wb3J0cyk7XG4gICAgaW1wb3J0cyA9IGltcG9ydHMgIT09IG51bGwgJiYgaW1wb3J0cyAhPT0gdm9pZCAwID8gaW1wb3J0cyA6IHt9O1xuICAgIHZhciBtb2R1bGU7XG4gICAgaWYgKCh3YXNtSW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KHdhc21JbnB1dCkpIHtcbiAgICAgICAgbW9kdWxlID0gbmV3IF9XZWJBc3NlbWJseS5Nb2R1bGUod2FzbUlucHV0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2FzbUlucHV0IGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZSA9IHdhc21JbnB1dDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgd2FzbSBzb3VyY2UnKTtcbiAgICB9XG4gICAgdmFyIGluc3RhbmNlID0gbmV3IF9XZWJBc3NlbWJseS5JbnN0YW5jZShtb2R1bGUsIGltcG9ydHMpO1xuICAgIHZhciBzb3VyY2UgPSB7IGluc3RhbmNlOiBpbnN0YW5jZSwgbW9kdWxlOiBtb2R1bGUgfTtcbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXBpTW9kdWxlKG9wdGlvbnMpIHtcbiAgICB2YXIgbmFwaU1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19OT0RFID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgPT09ICdvYmplY3QnICYmIHByb2Nlc3MudmVyc2lvbnMgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZyc7XG4gICAgICAgIHZhciBFTlZJUk9OTUVOVF9JU19QVEhSRUFEID0gQm9vbGVhbihvcHRpb25zLmNoaWxkVGhyZWFkKTtcbiAgICAgICAgdmFyIHdhaXRUaHJlYWRTdGFydCA9IHR5cGVvZiBvcHRpb25zLndhaXRUaHJlYWRTdGFydCA9PT0gJ251bWJlcicgPyBvcHRpb25zLndhaXRUaHJlYWRTdGFydCA6IEJvb2xlYW4ob3B0aW9ucy53YWl0VGhyZWFkU3RhcnQpO1xuICAgICAgICB2YXIgd2FzbUluc3RhbmNlO1xuICAgICAgICB2YXIgd2FzbU1lbW9yeTtcbiAgICAgICAgdmFyIHdhc21UYWJsZTtcbiAgICAgICAgdmFyIF9tYWxsb2M7XG4gICAgICAgIHZhciBfZnJlZTtcbiAgICAgICAgZnVuY3Rpb24gYWJvcnQobXNnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIF9XZWJBc3NlbWJseS5SdW50aW1lRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgX1dlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFwaU1vZHVsZSA9IHtcbiAgICAgICAgICAgIGltcG9ydHM6IHtcbiAgICAgICAgICAgICAgICBlbnY6IHt9LFxuICAgICAgICAgICAgICAgIG5hcGk6IHt9LFxuICAgICAgICAgICAgICAgIGVtbmFwaToge31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBvcnRzOiB7fSxcbiAgICAgICAgICAgIGVtbmFwaToge30sXG4gICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZmlsZW5hbWU6ICcnLFxuICAgICAgICAgICAgY2hpbGRUaHJlYWQ6IEVOVklST05NRU5UX0lTX1BUSFJFQUQsXG4gICAgICAgICAgICBpbml0V29ya2VyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBleGVjdXRlQXN5bmNXb3JrOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB3YWl0VGhyZWFkU3RhcnQ6IHdhaXRUaHJlYWRTdGFydCxcbiAgICAgICAgICAgIFBUaHJlYWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hcGlNb2R1bGUubG9hZGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFwaU1vZHVsZS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpIGluaXQgb3B0aW9ucycpO1xuICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG9wdGlvbnMuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgPT09IG51bGwgfHwgaW5zdGFuY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGluc3RhbmNlLmV4cG9ydHMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB3YXNtSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IGluc3RhbmNlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgdmFyIG1vZHVsZSA9IG9wdGlvbnMubW9kdWxlO1xuICAgICAgICAgICAgICAgIHZhciBtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSB8fCBleHBvcnRzLm1lbW9yeTtcbiAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBvcHRpb25zLnRhYmxlIHx8IGV4cG9ydHMuX19pbmRpcmVjdF9mdW5jdGlvbl90YWJsZTtcbiAgICAgICAgICAgICAgICBpZiAoIShtb2R1bGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuTW9kdWxlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCB3YXNtIG1vZHVsZScpO1xuICAgICAgICAgICAgICAgIGlmICghKG1lbW9yeSBpbnN0YW5jZW9mIF9XZWJBc3NlbWJseS5NZW1vcnkpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gbWVtb3J5Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCEodGFibGUgaW5zdGFuY2VvZiBfV2ViQXNzZW1ibHkuVGFibGUpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdhc20gdGFibGUnKTtcbiAgICAgICAgICAgICAgICB3YXNtTWVtb3J5ID0gbWVtb3J5O1xuICAgICAgICAgICAgICAgIHdhc21UYWJsZSA9IHRhYmxlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwb3J0cy5tYWxsb2MgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGxvYyBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMuZnJlZSAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZnJlZSBpcyBub3QgZXhwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICBfbWFsbG9jID0gZXhwb3J0cy5tYWxsb2M7XG4gICAgICAgICAgICAgICAgX2ZyZWUgPSBleHBvcnRzLmZyZWU7XG4gICAgICAgICAgICAgICAgaWYgKCFuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1haW4gdGhyZWFkIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUFwaVZlcnNpb24gPSA4IC8qIFZlcnNpb24uTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gKi87XG4gICAgICAgICAgICAgICAgICAgIHZhciBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxID0gaW5zdGFuY2UuZXhwb3J0cy5ub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVfYXBpX21vZHVsZV9nZXRfYXBpX3ZlcnNpb25fdjEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBub2RlX2FwaV9tb2R1bGVfZ2V0X2FwaV92ZXJzaW9uX3YxKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBuYXBpTW9kdWxlLmVudk9iamVjdCB8fCAobmFwaU1vZHVsZS5lbnZPYmplY3QgPSBlbW5hcGlDdHguY3JlYXRlRW52KG5hcGlNb2R1bGUuZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIGZ1bmN0aW9uIChjYikgeyByZXR1cm4gKHdhc21UYWJsZS5nZXQoY2IpKTsgfSwgZnVuY3Rpb24gKGNiKSB7IHJldHVybiAod2FzbVRhYmxlLmdldChjYikpOyB9LCBhYm9ydCwgZW1uYXBpTm9kZUJpbmRpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlXzEgPSBlbW5hcGlDdHgub3BlblNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbEludG9Nb2R1bGUoZnVuY3Rpb24gKF9lbnZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0cyA9IG5hcGlNb2R1bGUuZXhwb3J0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhwb3J0c0hhbmRsZSA9IHNjb3BlXzEuYWRkKGV4cG9ydHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXBpX3JlZ2lzdGVyX3dhc21fdjEgPSBpbnN0YW5jZS5leHBvcnRzLm5hcGlfcmVnaXN0ZXJfd2FzbV92MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFwaVZhbHVlID0gbmFwaV9yZWdpc3Rlcl93YXNtX3YxKF9lbnZPYmplY3QuaWQsIGV4cG9ydHNIYW5kbGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcGlNb2R1bGUuZXhwb3J0cyA9ICghbmFwaVZhbHVlKSA/IGV4cG9ydHMgOiBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG5hcGlWYWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGVfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmFwaU1vZHVsZS5lbnZPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXBpTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2YXIgZW1uYXBpQ3R4O1xuICAgICAgICB2YXIgZW1uYXBpTm9kZUJpbmRpbmc7XG4gICAgICAgIHZhciBvbkNyZWF0ZVdvcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGVycjtcbiAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcgfHwgY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGBvcHRpb25zLmNvbnRleHRgLiBVc2UgYGltcG9ydCB7IGdldERlZmF1bHRDb250ZXh0IH0gZnJvbSAnQGVtbmFwaS9ydW50aW1lJ2BcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHggPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW1uYXBpQ3R4ID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgICAgICB2YXIgcG9zdE1zZyA9IHR5cGVvZiBvcHRpb25zLnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLnBvc3RNZXNzYWdlXG4gICAgICAgICAgICAgICAgOiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyBwb3N0TWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcG9zdE1zZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIHBvc3RNZXNzYWdlIGZvdW5kJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlID0gcG9zdE1zZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmlsZW5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBuYXBpTW9kdWxlLmZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25DcmVhdGVXb3JrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQ3JlYXRlV29ya2VyID0gb3B0aW9ucy5vbkNyZWF0ZVdvcmtlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJpbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJpbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcmludEVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZXJyID0gb3B0aW9ucy5wcmludEVycjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnbm9kZUJpbmRpbmcnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHZhciBub2RlQmluZGluZyA9IG9wdGlvbnMubm9kZUJpbmRpbmc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVCaW5kaW5nICE9PSAnb2JqZWN0JyB8fCBub2RlQmluZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYG9wdGlvbnMubm9kZUJpbmRpbmdgLiBVc2UgQGVtbmFwaS9ub2RlLWJpbmRpbmcgcGFja2FnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcgPSBub2RlQmluZGluZztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSAwO1xuICAgICAgICBpZiAoJ2FzeW5jV29ya1Bvb2xTaXplJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYXN5bmNXb3JrUG9vbFNpemUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5hc3luY1dvcmtQb29sU2l6ZSBtdXN0IGJlIGEgaW50ZWdlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSBvcHRpb25zLmFzeW5jV29ya1Bvb2xTaXplID4+IDA7XG4gICAgICAgICAgICBpZiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPiAxMDI0KSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPSAxMDI0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZW1uYXBpQXN5bmNXb3JrUG9vbFNpemUgPCAtMTAyNCkge1xuICAgICAgICAgICAgICAgIGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplID0gLTEwMjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNpbmdsZVRocmVhZEFzeW5jV29yayA9IEVOVklST05NRU5UX0lTX1BUSFJFQUQgPyBmYWxzZSA6IChlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSA8PSAwKTtcbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhlbW5hcGlBc3luY1dvcmtQb29sU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVudi5fZW1uYXBpX2FzeW5jX3dvcmtfcG9vbF9zaXplID0gX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZTtcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlBZGRTZW5kTGlzdGVuZXIod29ya2VyKSB7XG4gICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAod29ya2VyLl9lbW5hcGlTZW5kTGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICBpZiAoX19lbW5hcGlfXyAmJiBfX2VtbmFwaV9fLnR5cGUgPT09ICdhc3luYy1zZW5kJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzEgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7IF9fZW1uYXBpX186IF9fZW1uYXBpX18gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfX2VtbmFwaV9fLnBheWxvYWQuY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKF9fZW1uYXBpX18ucGF5bG9hZC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIub2ZmKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpU2VuZExpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgIHdvcmtlci5vbignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBuYXBpTW9kdWxlLmVtbmFwaS5hZGRTZW5kTGlzdGVuZXIgPSBlbW5hcGlBZGRTZW5kTGlzdGVuZXI7XG4gICAgICAgIHZhciBQVGhyZWFkID0gbmV3IFRocmVhZE1hbmFnZXIoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgcHJpbnRFcnI6IGVycixcbiAgICAgICAgICAgICAgICBjaGlsZFRocmVhZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgcHJpbnRFcnI6IGVycixcbiAgICAgICAgICAgICAgICBiZWZvcmVMb2FkOiBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUFkZFNlbmRMaXN0ZW5lcih3b3JrZXIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmV1c2VXb3JrZXI6IG9wdGlvbnMucmV1c2VXb3JrZXIsXG4gICAgICAgICAgICAgICAgb25DcmVhdGVXb3JrZXI6IG9uQ3JlYXRlV29ya2VyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgbmFwaU1vZHVsZS5QVGhyZWFkID0gUFRocmVhZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbGFzdF9lcnJvcihlbnYsIGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlcnJvcl9jb2RlLCBlbmdpbmVfZXJyb3JfY29kZSwgZW5naW5lX3Jlc2VydmVkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NsZWFyX2xhc3RfZXJyb3IoZW52KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uKG1ham9yLCBtaW5vciwgcGF0Y2gpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ZXJzaW9ucyA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2VzcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMubm9kZSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgPyBwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKG4pIHsgcmV0dXJuIE51bWJlcihuKTsgfSlcbiAgICAgICAgICAgICAgICA6IFswLCAwLCAwXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIobWFqb3IsIHZlcnNpb25zWzBdLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihtaW5vciwgdmVyc2lvbnNbMV0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHBhdGNoLCB2ZXJzaW9uc1syXSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqIEBfX2RlcHMgJHJ1bnRpbWVLZWVwYWxpdmVQdXNoXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2goKSB7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqIEBfX2RlcHMgJHJ1bnRpbWVLZWVwYWxpdmVQb3BcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcG9wKCkge1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3NldF9pbW1lZGlhdGUoY2FsbGJhY2ssIGRhdGEpIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdnBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX25leHRfdGljayhjYWxsYmFjaywgZGF0YSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdmlwcHBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlKGZvcmNlVW5jYXVnaHQsIGVudiwgY2FsbGJhY2ssIGRhdGEsIGNsb3NlX3Njb3BlX2lmX3Rocm93KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbGJhY2tJbnRvTW9kdWxlKEJvb2xlYW4oZm9yY2VVbmNhdWdodCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbGJhY2spKShlbnYsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCwgc2NvcGUpO1xuICAgICAgICAgICAgICAgIGlmIChjbG9zZV9zY29wZV9pZl90aHJvdykge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIHZpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jYWxsX2ZpbmFsaXplcihmb3JjZVVuY2F1Z2h0LCBlbnYsIGNhbGxiYWNrLCBkYXRhLCBoaW50KSB7XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxGaW5hbGl6ZXJJbnRlcm5hbChmb3JjZVVuY2F1Z2h0LCBjYWxsYmFjaywgZGF0YSwgaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyB2XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2N0eF9pbmNyZWFzZV93YWl0aW5nX3JlcXVlc3RfY291bnRlcigpIHtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgdlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9jdHhfZGVjcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXIoKSB7XG4gICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiAkZW1uYXBpU2V0VmFsdWVJNjQocmVzdWx0LCBudW1iZXJWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIHRlbXBEb3VibGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdGVtcEk2NCA9IFtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA+Pj4gMCxcbiAgICAgICAgICAgICAgICAodGVtcERvdWJsZSA9IG51bWJlclZhbHVlLCArTWF0aC5hYnModGVtcERvdWJsZSkgPj0gMSA/IHRlbXBEb3VibGUgPiAwID8gKE1hdGgubWluKCtNYXRoLmZsb29yKHRlbXBEb3VibGUgLyA0Mjk0OTY3Mjk2KSwgNDI5NDk2NzI5NSkgfCAwKSA+Pj4gMCA6IH5+K01hdGguY2VpbCgodGVtcERvdWJsZSAtICsofn50ZW1wRG91YmxlID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMCA6IDApXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdGVtcEk2NFswXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCB0ZW1wSTY0WzFdLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRpbE1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICAkZW1uYXBpU2V0VmFsdWVJNjQ6ICRlbW5hcGlTZXRWYWx1ZUk2NCxcbiAgICAgICAgICAgIF9lbW5hcGlfY2FsbF9maW5hbGl6ZXI6IF9lbW5hcGlfY2FsbF9maW5hbGl6ZXIsXG4gICAgICAgICAgICBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlOiBfZW1uYXBpX2NhbGxiYWNrX2ludG9fbW9kdWxlLFxuICAgICAgICAgICAgX2VtbmFwaV9jdHhfZGVjcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXI6IF9lbW5hcGlfY3R4X2RlY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyLFxuICAgICAgICAgICAgX2VtbmFwaV9jdHhfaW5jcmVhc2Vfd2FpdGluZ19yZXF1ZXN0X2NvdW50ZXI6IF9lbW5hcGlfY3R4X2luY3JlYXNlX3dhaXRpbmdfcmVxdWVzdF9jb3VudGVyLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfbm9kZV92ZXJzaW9uOiBfZW1uYXBpX2dldF9ub2RlX3ZlcnNpb24sXG4gICAgICAgICAgICBfZW1uYXBpX25leHRfdGljazogX2VtbmFwaV9uZXh0X3RpY2ssXG4gICAgICAgICAgICBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3BvcDogX2VtbmFwaV9ydW50aW1lX2tlZXBhbGl2ZV9wb3AsXG4gICAgICAgICAgICBfZW1uYXBpX3J1bnRpbWVfa2VlcGFsaXZlX3B1c2g6IF9lbW5hcGlfcnVudGltZV9rZWVwYWxpdmVfcHVzaCxcbiAgICAgICAgICAgIF9lbW5hcGlfc2V0X2ltbWVkaWF0ZTogX2VtbmFwaV9zZXRfaW1tZWRpYXRlLFxuICAgICAgICAgICAgbmFwaV9jbGVhcl9sYXN0X2Vycm9yOiBuYXBpX2NsZWFyX2xhc3RfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3NldF9sYXN0X2Vycm9yOiBuYXBpX3NldF9sYXN0X2Vycm9yXG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlHZXRXb3JrZXJCeVB0aHJlYWRQdHIocHRocmVhZFB0cikge1xuICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB3YXNpLXNkay0yMC4wK3RocmVhZHNcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBzdHJ1Y3QgcHRocmVhZCB7XG4gICAgICAgICAgICAgKiAgIHN0cnVjdCBwdGhyZWFkICpzZWxmOyAgICAgICAgLy8gMFxuICAgICAgICAgICAgICogICBzdHJ1Y3QgcHRocmVhZCAqcHJldiwgKm5leHQ7IC8vIDQsIDhcbiAgICAgICAgICAgICAqICAgdWludHB0cl90IHN5c2luZm87ICAgICAgICAgICAvLyAxMlxuICAgICAgICAgICAgICogICB1aW50cHRyX3QgY2FuYXJ5OyAgICAgICAgICAgIC8vIDE2XG4gICAgICAgICAgICAgKiAgIGludCB0aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gMjBcbiAgICAgICAgICAgICAqICAgLy8gLi4uXG4gICAgICAgICAgICAgKiB9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciB0aWRPZmZzZXQgPSAyMDtcbiAgICAgICAgICAgIHZhciB0aWQgPSB2aWV3LmdldEludDMyKHB0aHJlYWRQdHIgKyB0aWRPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IFBUaHJlYWQucHRocmVhZHNbdGlkXTtcbiAgICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX3dvcmtlcl91bnJlZihwdGhyZWFkUHRyKSB7XG4gICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpR2V0V29ya2VyQnlQdGhyZWFkUHRyKHB0aHJlYWRQdHIpO1xuICAgICAgICAgICAgaWYgKHdvcmtlciAmJiB0eXBlb2Ygd29ya2VyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2aXBwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYXN5bmNfc2VuZF9qcyh0eXBlLCBjYWxsYmFjaywgZGF0YSkge1xuICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2VfMSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhc3luYy1zZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9zZXRfaW1tZWRpYXRlKGNhbGxiYWNrLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfZW1uYXBpX25leHRfdGljayhjYWxsYmFjaywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZnVuY3Rpb24gcHRyVG9TdHJpbmcgKHB0cjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgLy8gICByZXR1cm4gJzB4JyArICgnMDAwMDAwMDAnICsgcHRyLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTgpXG4gICAgICAgIC8vIH1cbiAgICAgICAgdmFyIHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZTtcbiAgICAgICAgdmFyIHV2VGhyZWFkcG9vbFJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5UmVzb2x2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1dlRocmVhZHBvb2xSZWFkeS5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHV2VGhyZWFkcG9vbFJlYWR5LnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIC8qKiBAX19zaWcgaSAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2lzX21haW5fYnJvd3Nlcl90aHJlYWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREUpID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfYWZ0ZXJfdXZ0aHJlYWRwb29sX3JlYWR5KGNhbGxiYWNrLCBxLCB0eXBlKSB7XG4gICAgICAgICAgICBpZiAodXZUaHJlYWRwb29sUmVhZHkucmVhZHkpIHtcbiAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjYWxsYmFjaykpKHEsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXZUaHJlYWRwb29sUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNhbGxiYWNrKSkocSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cGkgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbCh0aHJlYWRzLCBzaXplKSB7XG4gICAgICAgICAgICB2YXIgcCA9IFtdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHRocmVhZFB0ciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHRocmVhZHMgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmtlciA9IGVtbmFwaUdldFdvcmtlckJ5UHRocmVhZFB0cihwdGhyZWFkUHRyKTtcbiAgICAgICAgICAgICAgICBwLnB1c2gobmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfX2VtbmFwaV9fID0gZGF0YS5fX2VtbmFwaV9fO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18gJiYgX19lbW5hcGlfXy50eXBlID09PSAnYXN5bmMtdGhyZWFkLXJlYWR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2VyICYmIHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoRU5WSVJPTk1FTlRfSVNfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgX2xvb3BfMShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHApLnRoZW4odXZUaHJlYWRwb29sUmVhZHlSZXNvbHZlKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHYgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeSgpIHtcbiAgICAgICAgICAgIGlmICghRU5WSVJPTk1FTlRfSVNfUFRIUkVBRClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB2YXIgcG9zdE1lc3NhZ2UgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgcG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXRocmVhZC1yZWFkeScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFzeW5jTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfYWZ0ZXJfdXZ0aHJlYWRwb29sX3JlYWR5OiBfZW1uYXBpX2FmdGVyX3V2dGhyZWFkcG9vbF9yZWFkeSxcbiAgICAgICAgICAgIF9lbW5hcGlfYXN5bmNfc2VuZF9qczogX2VtbmFwaV9hc3luY19zZW5kX2pzLFxuICAgICAgICAgICAgX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeTogX2VtbmFwaV9lbWl0X2FzeW5jX3RocmVhZF9yZWFkeSxcbiAgICAgICAgICAgIF9lbW5hcGlfaXNfbWFpbl9icm93c2VyX3RocmVhZDogX2VtbmFwaV9pc19tYWluX2Jyb3dzZXJfdGhyZWFkLFxuICAgICAgICAgICAgX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbDogX2VtbmFwaV90ZWxsX2pzX3V2dGhyZWFkcG9vbCxcbiAgICAgICAgICAgIF9lbW5hcGlfd29ya2VyX3VucmVmOiBfZW1uYXBpX3dvcmtlcl91bnJlZlxuICAgICAgICB9KTtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuICAgICAgICAvKiogQF9fc2lnIGlwanAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5KGVudiwgY2hhbmdlX2luX2J5dGVzLCBhZGp1c3RlZF92YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWFkanVzdGVkX3ZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgY2hhbmdlX2luX2J5dGVzX251bWJlciA9IE51bWJlcihjaGFuZ2VfaW5fYnl0ZXMpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZV9pbl9ieXRlc19udW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvbGRfc2l6ZSA9IHdhc21NZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB2YXIgbmV3X3NpemUgPSBvbGRfc2l6ZSArIGNoYW5nZV9pbl9ieXRlc19udW1iZXI7XG4gICAgICAgICAgICBuZXdfc2l6ZSA9IG5ld19zaXplICsgKCg2NTUzNiAtIG5ld19zaXplICUgNjU1MzYpICUgNjU1MzYpO1xuICAgICAgICAgICAgaWYgKHdhc21NZW1vcnkuZ3JvdygobmV3X3NpemUgLSBvbGRfc2l6ZSArIDY1NTM1KSA+PiAxNikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0QmlnSW50NjQoYWRqdXN0ZWRfdmFsdWUsIEJpZ0ludCh3YXNtTWVtb3J5LmJ1ZmZlci5ieXRlTGVuZ3RoKSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZW1uYXBpU2V0VmFsdWVJNjQoYWRqdXN0ZWRfdmFsdWUsIHdhc21NZW1vcnkuYnVmZmVyLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtZW1vcnlNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9hZGp1c3RfZXh0ZXJuYWxfbWVtb3J5OiBuYXBpX2FkanVzdF9leHRlcm5hbF9tZW1vcnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlBV1NULmluaXQoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgZW1uYXBpQVdTVCA9IHtcbiAgICAgICAgICAgIGlkR2VuOiB7fSxcbiAgICAgICAgICAgIHZhbHVlczogW3VuZGVmaW5lZF0sXG4gICAgICAgICAgICBxdWV1ZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHBlbmRpbmc6IFtdLFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBpZEdlbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dElkOiAxLFxuICAgICAgICAgICAgICAgICAgICBsaXN0OiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEdlbi5saXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gaWRHZW4ubGlzdC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBpZEdlbi5uZXh0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRHZW4ubmV4dElkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJldXNlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkR2VuLmxpc3QucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuaWRHZW4gPSBpZEdlbjtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWVkID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucGVuZGluZyA9IFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGVudiwgcmVzb3VyY2UsIHJlc291cmNlTmFtZSwgZXhlY3V0ZSwgY29tcGxldGUsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jQ29udGV4dCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jSW5pdChyZXNvdXJjZSwgcmVzb3VyY2VOYW1lLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jSWQgPSBhc3luY0NvbnRleHQuYXN5bmNJZDtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQgPSBhc3luY0NvbnRleHQudHJpZ2dlckFzeW5jSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpZCA9IGVtbmFwaUFXU1QuaWRHZW4uZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGVudjogZW52LFxuICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJBc3luY0lkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGV4ZWN1dGUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBjb21wbGV0ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29tcGxldGUgPSB3b3JrLmNvbXBsZXRlO1xuICAgICAgICAgICAgICAgIHZhciBlbnYgPSB3b3JrLmVudjtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHdvcmsuZGF0YTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tcGxldGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jYWxsYmFja0ludG9Nb2R1bGUodHJ1ZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXNtVGFibGUuZ2V0KGNvbXBsZXRlKSkoZW52LCBzdGF0dXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QsIHNjb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHdvcmsucmVzb3VyY2UsIGNhbGxiYWNrLCBbXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogd29yay5hc3luY0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHdvcmsudHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBxdWV1ZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmsgPSBlbW5hcGlBV1NULnZhbHVlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHdvcmsuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmsuc3RhdHVzID0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUFXU1QucXVldWVkLnNpemUgPj0gKE1hdGguYWJzKGVtbmFwaUFzeW5jV29ya1Bvb2xTaXplKSB8fCA0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5wZW5kaW5nLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucXVldWVkLmFkZChpZCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZfMSA9IHdvcmsuZW52O1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YV8xID0gd29yay5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBleGVjdXRlID0gd29yay5leGVjdXRlO1xuICAgICAgICAgICAgICAgICAgICB3b3JrLnN0YXR1cyA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52XzEsIGRhdGFfMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlZC5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29yay5zdGF0dXMgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV1NULmNhbGxDb21wbGV0ZSh3b3JrLCAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdTVC5wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFdvcmtJZCA9IGVtbmFwaUFXU1QucGVuZGluZy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QudmFsdWVzW25leHRXb3JrSWRdLnN0YXR1cyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5xdWV1ZShuZXh0V29ya0lkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZW1uYXBpQVdTVC5wZW5kaW5nLmluZGV4T2YoaWQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcmtfMSA9IGVtbmFwaUFXU1QudmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtfMSAmJiAod29ya18xLnN0YXR1cyA9PT0gMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfMS5zdGF0dXMgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5wZW5kaW5nLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZmVhdHVyZS5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QuY2FsbENvbXBsZXRlKHdvcmtfMSwgMTEgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5jZWxsZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi87XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgd29yayA9IGVtbmFwaUFXU1QudmFsdWVzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5lbWl0QXN5bmNEZXN0cm95KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IHdvcmsuYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB3b3JrLnRyaWdnZXJBc3luY0lkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnZhbHVlc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdTVC5pZEdlbi5yZXVzZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgdnBwZHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfaW5pdChhc3luY19yZXNvdXJjZSwgYXN5bmNfcmVzb3VyY2VfbmFtZSwgdHJpZ2dlcl9hc3luY19pZCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlX25hbWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlX25hbWUpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIGFzeW5jQ29udGV4dCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUuZW1pdEFzeW5jSW5pdChyZXNvdXJjZSwgcmVzb3VyY2VfbmFtZSwgdHJpZ2dlcl9hc3luY19pZCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgYXN5bmNJZCA9IGFzeW5jQ29udGV4dC5hc3luY0lkO1xuICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gYXN5bmNDb250ZXh0LnRyaWdnZXJBc3luY0lkO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIGFzeW5jSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0ICsgOCwgdHJpZ2dlckFzeW5jSWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgdmRkICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNfaWQsIHRyaWdnZXJfYXN5bmNfaWQpIHtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5lbWl0QXN5bmNEZXN0cm95KHtcbiAgICAgICAgICAgICAgICBhc3luY0lkOiBhc3luY19pZCxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlcl9hc3luY19pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogdnBkZHAgZXhwb3J0IGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9vcGVuX2NhbGxiYWNrX3Njb3BlIChhc3luY19yZXNvdXJjZTogbmFwaV92YWx1ZSwgYXN5bmNfaWQ6IGRvdWJsZSwgdHJpZ2dlcl9hc3luY19pZDogZG91YmxlLCByZXN1bHQ6IFBvaW50ZXI8aW50NjRfdD4pOiB2b2lkIHtcbiAgICAgICAgICBpZiAoIWVtbmFwaU5vZGVCaW5kaW5nIHx8ICFyZXN1bHQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkhLnZhbHVlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgIGNvbnN0IG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyID0gZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5vcGVuQ2FsbGJhY2tTY29wZShyZXNvdXJjZSwge1xuICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlcl9hc3luY19pZFxuICAgICAgICAgIH0pXG4gICAgXG4gICAgICAgICAgZnJvbTY0KCdyZXN1bHQnKVxuICAgICAgICAgICRfVE9ET19tYWtlU2V0VmFsdWUoJ3Jlc3VsdCcsIDAsICduYXRpdmVDYWxsYmFja1Njb3BlUG9pbnRlcicsICdpNjQnKVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIHZwXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBfZW1uYXBpX25vZGVfY2xvc2VfY2FsbGJhY2tfc2NvcGUgKHNjb3BlOiBQb2ludGVyPGludDY0X3Q+KTogdm9pZCB7XG4gICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZyB8fCAhc2NvcGUpIHJldHVyblxuICAgICAgICAgIGZyb202NCgnc2NvcGUnKVxuICAgICAgICAgIGNvbnN0IG5hdGl2ZUNhbGxiYWNrU2NvcGVQb2ludGVyID0gJF9UT0RPX21ha2VHZXRWYWx1ZSgnc2NvcGUnLCAwLCAnaTY0JylcbiAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLmNsb3NlQ2FsbGJhY2tTY29wZShCaWdJbnQobmF0aXZlQ2FsbGJhY2tTY29wZVBvaW50ZXIpKVxuICAgICAgICB9ICovXG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwZGRwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfbm9kZV9tYWtlX2NhbGxiYWNrKGVudiwgYXN5bmNfcmVzb3VyY2UsIGNiLCBhcmd2LCBzaXplLCBhc3luY19pZCwgdHJpZ2dlcl9hc3luY19pZCwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNiKS52YWx1ZTtcbiAgICAgICAgICAgIHNpemUgPSBzaXplID4+PiAwO1xuICAgICAgICAgICAgdmFyIGFyciA9IEFycmF5KHNpemUpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGZvciAoOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYXJyW2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5vZGUubWFrZUNhbGxiYWNrKHJlc291cmNlLCBjYWxsYmFjaywgYXJyLCB7XG4gICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNfaWQsXG4gICAgICAgICAgICAgICAgdHJpZ2dlckFzeW5jSWQ6IHRyaWdnZXJfYXN5bmNfaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0KTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX2luaXRfanMoYXN5bmNfcmVzb3VyY2UsIGFzeW5jX3Jlc291cmNlX25hbWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc291cmNlO1xuICAgICAgICAgICAgaWYgKGFzeW5jX3Jlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBPYmplY3QoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5hbWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFzeW5jX3Jlc291cmNlX25hbWUpLnZhbHVlO1xuICAgICAgICAgICAgdmFyIHJldCA9IGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuYXN5bmNJbml0KHJlc291cmNlLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXQuc3RhdHVzO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gcmV0LnZhbHVlO1xuICAgICAgICAgICAgaWYgKCEoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSkge1xuICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgJiAoKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjQpKSAtIEJpZ0ludCgxKSk7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlclZhbHVlID49IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyVmFsdWUgPSBudW1iZXJWYWx1ZSAtIChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2FzeW5jX2Rlc3Ryb3lfanMoYXN5bmNfY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhc3luY19jb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXN5bmNfY29udGV4dCArIDQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHBvaW50ZXIgPSBCaWdJbnQobG93ID4+PiAwKSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICB2YXIgcmV0ID0gZW1uYXBpTm9kZUJpbmRpbmcubmFwaS5hc3luY0Rlc3Ryb3kocG9pbnRlcik7XG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LnN0YXR1cztcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlLWFkZG9uLWFwaS9wdWxsLzEyODNcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGUoZW52LCBpZ25vcmVkLCBhc3luY19jb250ZXh0X2hhbmRsZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlfb3Blbl9jYWxsYmFja19zY29wZSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZShlbnYsIHNjb3BlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlfY2xvc2VfY2FsbGJhY2tfc2NvcGUgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9tYWtlX2NhbGxiYWNrKGVudiwgYXN5bmNfY29udGV4dCwgcmVjdiwgZnVuYywgYXJnYywgYXJndiwgcmVzdWx0KSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVjdilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnYyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd2KVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHY4cmVjdiA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlY3YpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgdjhmdW5jID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHY4ZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhc3luY19jb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFzeW5jX2NvbnRleHQgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gQmlnSW50KGxvdyA+Pj4gMCkgfCAoQmlnSW50KGhpZ2gpIDw8IEJpZ0ludCgzMikpO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSBBcnJheShhcmdjKTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXJnVmFsID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXJndiArIGkgKiA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gZW1uYXBpTm9kZUJpbmRpbmcubmFwaS5tYWtlQ2FsbGJhY2soY3R4LCB2OHJlY3YsIHY4ZnVuYywgYXJyKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJldC5lcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IocmV0LnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQocmV0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzcyhlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBub2RlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIF9lbW5hcGlfYXN5bmNfZGVzdHJveV9qczogX2VtbmFwaV9hc3luY19kZXN0cm95X2pzLFxuICAgICAgICAgICAgX2VtbmFwaV9hc3luY19pbml0X2pzOiBfZW1uYXBpX2FzeW5jX2luaXRfanMsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9jaGVja19nY19hY2Nlc3M6IF9lbW5hcGlfZW52X2NoZWNrX2djX2FjY2VzcyxcbiAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3k6IF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3ksXG4gICAgICAgICAgICBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0OiBfZW1uYXBpX25vZGVfZW1pdF9hc3luY19pbml0LFxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX21ha2VfY2FsbGJhY2s6IF9lbW5hcGlfbm9kZV9tYWtlX2NhbGxiYWNrLFxuICAgICAgICAgICAgbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZTogbmFwaV9jbG9zZV9jYWxsYmFja19zY29wZSxcbiAgICAgICAgICAgIG5hcGlfbWFrZV9jYWxsYmFjazogbmFwaV9tYWtlX2NhbGxiYWNrLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2NhbGxiYWNrX3Njb3BlOiBuYXBpX29wZW5fY2FsbGJhY2tfc2NvcGVcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19kZXBzIG1hbGxvY1xuICAgICAgICAgKiBAX19kZXBzIGZyZWVcbiAgICAgICAgICogQF9fcG9zdHNldFxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICogZW1uYXBpVFNGTi5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaVRTRk4gPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IHtcbiAgICAgICAgICAgICAgICAvKiBuYXBpX3JlZiAqLyByZXNvdXJjZTogMCxcbiAgICAgICAgICAgICAgICAvKiBkb3VibGUgKi8gYXN5bmNfaWQ6IDgsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIHRyaWdnZXJfYXN5bmNfaWQ6IDE2LFxuICAgICAgICAgICAgICAgIC8qIHNpemVfdCAqLyBxdWV1ZV9zaXplOiAyNCxcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBxdWV1ZTogMSAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBzaXplX3QgKi8gdGhyZWFkX2NvdW50OiAyICogNCArIDI0LFxuICAgICAgICAgICAgICAgIC8qIGJvb2wgKi8gaXNfY2xvc2luZzogMyAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICAvKiBhdG9taWNfdWNoYXIgKi8gZGlzcGF0Y2hfc3RhdGU6IDMgKiA0ICsgMjgsXG4gICAgICAgICAgICAgICAgLyogdm9pZCogKi8gY29udGV4dDogMyAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBzaXplX3QgKi8gbWF4X3F1ZXVlX3NpemU6IDQgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9yZWYgKi8gcmVmOiA1ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZW52ICovIGVudjogNiAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiB2b2lkKiAqLyBmaW5hbGl6ZV9kYXRhOiA3ICogNCArIDMyLFxuICAgICAgICAgICAgICAgIC8qIG5hcGlfZmluYWxpemUgKi8gZmluYWxpemVfY2I6IDggKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX2NhbGxfanMgKi8gY2FsbF9qc19jYjogOSAqIDQgKyAzMixcbiAgICAgICAgICAgICAgICAvKiBib29sICovIGhhbmRsZXNfY2xvc2luZzogMTAgKiA0ICsgMzIsXG4gICAgICAgICAgICAgICAgLyogYm9vbCAqLyBhc3luY19yZWY6IDEwICogNCArIDM2LFxuICAgICAgICAgICAgICAgIC8qIGludDMyX3QgKi8gbXV0ZXg6IDEwICogNCArIDQwLFxuICAgICAgICAgICAgICAgIC8qIGludDMyX3QgKi8gY29uZDogMTAgKiA0ICsgNDQsXG4gICAgICAgICAgICAgICAgZW5kOiAxMCAqIDQgKyA0OFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFBUaHJlYWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQudW51c2VkV29ya2Vycy5mb3JFYWNoKGVtbmFwaVRTRk4uYWRkTGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgICBQVGhyZWFkLnJ1bm5pbmdXb3JrZXJzLmZvckVhY2goZW1uYXBpVFNGTi5hZGRMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfX29yaWdpbmFsX2dldE5ld1dvcmtlcl8xID0gUFRocmVhZC5nZXROZXdXb3JrZXI7XG4gICAgICAgICAgICAgICAgICAgIFBUaHJlYWQuZ2V0TmV3V29ya2VyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBfX29yaWdpbmFsX2dldE5ld1dvcmtlcl8xLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmFkZExpc3RlbmVyKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFkZExpc3RlbmVyOiBmdW5jdGlvbiAod29ya2VyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyLl9lbW5hcGlUU0ZOTGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBFTlZJUk9OTUVOVF9JU19OT0RFID8gZSA6IGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9fZW1uYXBpX18gPSBkYXRhLl9fZW1uYXBpX187XG4gICAgICAgICAgICAgICAgICAgIGlmIChfX2VtbmFwaV9fKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IF9fZW1uYXBpX18udHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0gX19lbW5hcGlfXy5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICd0c2ZuLXNlbmQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5kaXNwYXRjaChwYXlsb2FkLnRzZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaVRTRk5MaXN0ZW5lcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpVFNGTkxpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdFF1ZXVlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gMiAqIDQ7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gX21hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICBpZiAoIXF1ZXVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHF1ZXVlLCBzaXplKS5maWxsKDApO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZSwgcXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAocXVldWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2ZyZWUocXVldWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwdXNoUXVldWU6IGZ1bmN0aW9uIChmdW5jLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgdGFpbCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBzaXplID0gMiAqIDQ7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBfbWFsbG9jKHNpemUpO1xuICAgICAgICAgICAgICAgIGlmICghbm9kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPT00nKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN0b3JlU2l6ZVR5cGVWYWx1ZShub2RlLCBkYXRhLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUobm9kZSArIDQsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZCA9PT0gMCAmJiB0YWlsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlLCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlICsgNCwgbm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUodGFpbCArIDQsIG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCBub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uYWRkUXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNoaWZ0UXVldWU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB2YXIgaGVhZCA9IGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUocXVldWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBoZWFkO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShoZWFkICsgNCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKHF1ZXVlLCBuZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdG9yZVNpemVUeXBlVmFsdWUocXVldWUgKyA0LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc3RvcmVTaXplVHlwZVZhbHVlKG5vZGUgKyA0LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShub2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgX2ZyZWUobm9kZSk7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdWJRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChmdW5jLCBkYXRhLCBtb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FpdENvbmRpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXVlU2l6ZSA9IGVtbmFwaVRTRk4uZ2V0UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4U2l6ZSA9IGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNDbG9zaW5nID0gZW1uYXBpVFNGTi5nZXRJc0Nsb3NpbmcoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWV1ZVNpemUgPj0gbWF4U2l6ZSAmJiBtYXhTaXplID4gMCAmJiAhaXNDbG9zaW5nO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIGlzQnJvd3Nlck1haW4gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmICFFTlZJUk9OTUVOVF9JU19OT0RFO1xuICAgICAgICAgICAgICAgIHJldHVybiBtdXRleC5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhaXRDb25kaXRpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IDAgLyogbmFwaV90aHJlYWRzYWZlX2Z1bmN0aW9uX2NhbGxfbW9kZS5uYXBpX3RzZm5fbm9uYmxvY2tpbmcgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTUgLyogbmFwaV9zdGF0dXMubmFwaV9xdWV1ZV9mdWxsICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBCcm93c2VyIEpTIG1haW4gdGhyZWFkIGNhbiBub3QgdXNlIGBBdG9taWNzLndhaXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsYXRlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMyNjg5XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMzQ1M1xuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyTWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMSAvKiBuYXBpX3N0YXR1cy5uYXBpX3dvdWxkX2RlYWRsb2NrICovO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZC53YWl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0SXNDbG9zaW5nKGZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnN1YlRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNiAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nsb3NpbmcgKi87XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnB1c2hRdWV1ZShmdW5jLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2VuZChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRNdXRleDogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQubXV0ZXg7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0ge1xuICAgICAgICAgICAgICAgICAgICBsb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNCcm93c2VyTWFpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgIUVOVklST05NRU5UX0lTX05PREU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCcm93c2VyTWFpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvKiBsb2NrQXN5bmMgKCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFnYWluID0gKCk6IHZvaWQgPT4geyBmbigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpMzJhID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIGluZGV4LCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IEF0b21pY3MuY29tcGFyZUV4Y2hhbmdlKGkzMmEsIDAsIDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChBdG9taWNzIGFzIGFueSkud2FpdEFzeW5jKGkzMmEsIDAsIDEpLnZhbHVlLnRoZW4oYWdhaW4pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSwgKi9cbiAgICAgICAgICAgICAgICAgICAgdW5sb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTMyYSA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBBdG9taWNzLmNvbXBhcmVFeGNoYW5nZShpMzJhLCAwLCAxLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gdW5sb2NrIHdoaWxlIG5vdCBob2xkaW5nIHRoZSBtdXRleCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5ub3RpZnkoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGV4LnVubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8qICxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUFzeW5jPFQ+IChmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdXRleC5sb2NrQXN5bmMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJcbiAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSAqL1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIG11dGV4O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldENvbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbmQ7XG4gICAgICAgICAgICAgICAgdmFyIG11dGV4ID0gZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgY29uZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gQXRvbWljcy5sb2FkKGkzMmEsIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgudW5sb2NrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLndhaXQoaTMyYSwgMCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXgubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvKiB3YWl0QXN5bmMgKCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBdG9taWNzLmxvYWQoaTMyYSwgMClcbiAgICAgICAgICAgICAgICAgICAgICBtdXRleC51bmxvY2soKVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2sgPSAoKTogUHJvbWlzZTx2b2lkPiA9PiBtdXRleC5sb2NrQXN5bmMoKVxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEF0b21pY3MgYXMgYW55KS53YWl0QXN5bmMoaTMyYSwgMCwgdmFsdWUpLnZhbHVlLnRoZW4obG9jaywgbG9jaylcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NrKClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sICovXG4gICAgICAgICAgICAgICAgICAgIHNpZ25hbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkzMmEgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoaTMyYSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNzLm5vdGlmeShpMzJhLCAwLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5xdWV1ZV9zaXplLCB0cnVlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRRdWV1ZVNpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnF1ZXVlX3NpemU7XG4gICAgICAgICAgICAgICAgdmFyIGFyciwgaW5kZXg7XG4gICAgICAgICAgICAgICAgYXJyID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IChmdW5jICsgb2Zmc2V0KSA+PiAyO1xuICAgICAgICAgICAgICAgIEF0b21pY3MuYWRkKGFyciwgaW5kZXgsIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1YlF1ZXVlU2l6ZTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gZW1uYXBpVFNGTi5vZmZzZXQucXVldWVfc2l6ZTtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdWIoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0VGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkVGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudDtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5hZGQoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3ViVGhyZWFkQ291bnQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudDtcbiAgICAgICAgICAgICAgICB2YXIgYXJyLCBpbmRleDtcbiAgICAgICAgICAgICAgICBhcnIgPSBuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGZ1bmMgKyBvZmZzZXQpID4+IDI7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdWIoYXJyLCBpbmRleCwgMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0SXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmlzX2Nsb3NpbmcpID4+IDIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldElzQ2xvc2luZzogZnVuY3Rpb24gKGZ1bmMsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgQXRvbWljcy5zdG9yZShuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuaXNfY2xvc2luZykgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEhhbmRsZXNDbG9zaW5nOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmhhbmRsZXNfY2xvc2luZykgPj4gMik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0SGFuZGxlc0Nsb3Npbmc6IGZ1bmN0aW9uIChmdW5jLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUobmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmhhbmRsZXNfY2xvc2luZykgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERpc3BhdGNoU3RhdGU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY3MubG9hZChuZXcgVWludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLCAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmRpc3BhdGNoX3N0YXRlKSA+PiAyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb250ZXh0OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5jb250ZXh0LCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0TWF4UXVldWVTaXplOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5tYXhfcXVldWVfc2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RW52OiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5lbnYsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDYWxsSlNDYjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuY2FsbF9qc19jYiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlZjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQucmVmLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVzb3VyY2U6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnJlc291cmNlLCBmYWxzZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0RmluYWxpemVDYjogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZShmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfY2IsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRGaW5hbGl6ZURhdGE6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmZpbmFsaXplX2RhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2FkU2l6ZVR5cGVWYWx1ZTogZnVuY3Rpb24gKG9mZnNldCwgdW5zaWduZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgICAgIHZhciBhcnI7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IEF0b21pY3MubG9hZChhcnIsIG9mZnNldCA+PiAyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQXRvbWljcy5sb2FkKGFyciwgb2Zmc2V0ID4+IDIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdG9yZVNpemVUeXBlVmFsdWU6IGZ1bmN0aW9uIChvZmZzZXQsIHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnI7XG4gICAgICAgICAgICAgICAgaWYgKHVuc2lnbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyciA9IG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEF0b21pY3Muc3RvcmUoYXJyLCBvZmZzZXQgPj4gMiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgb2Zmc2V0ID4+IDIsIHZhbHVlID4+PiAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRlc3Ryb3lRdWV1ZShmdW5jKTtcbiAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpVFNGTi5nZXRSZWYoZnVuYyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVtb3ZlQ2xlYW51cEhvb2soZW52T2JqZWN0LCBlbW5hcGlUU0ZOLmNsZWFudXAsIGZ1bmMpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIHZhciBhc3luY1JlZk9mZnNldCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmKSA+PiAyO1xuICAgICAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgSW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKEF0b21pY3MubG9hZChhcnIsIGFzeW5jUmVmT2Zmc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlID0gZW1uYXBpVFNGTi5nZXRSZXNvdXJjZShmdW5jKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaU5vZGVCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJBc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC50cmlnZ2VyX2FzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfZGVzdHJveShhc3luY0lkLCB0cmlnZ2VyQXN5bmNJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9mcmVlKGZ1bmMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtcHR5UXVldWVBbmREZWxldGU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGxKc0NiID0gZW1uYXBpVFNGTi5nZXRDYWxsSlNDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVtbmFwaVRTRk4uZ2V0UXVldWVTaXplKGZ1bmMpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBlbW5hcGlUU0ZOLnNoaWZ0UXVldWUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsSnNDYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbEpzQ2IpKSgwLCAwLCBjb250ZXh0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRlc3Ryb3koZnVuYyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmluYWxpemU6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaVRTRk4uZ2V0RW52KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmaW5hbGl6ZSA9IGVtbmFwaVRTRk4uZ2V0RmluYWxpemVDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlUU0ZOLmdldEZpbmFsaXplRGF0YShmdW5jKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jYWxsRmluYWxpemVySW50ZXJuYWwoMCwgZmluYWxpemUsIGRhdGEsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV92YWx1ZSA9IGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpTm9kZUJpbmRpbmcubm9kZS5tYWtlQ2FsbGJhY2socmVzb3VyY2VPYmplY3QsIGYsIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSWQ6IGFzeW5jSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB0cmlnZ2VyQXN5bmNJZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZW1wdHlRdWV1ZUFuZERlbGV0ZShmdW5jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsZWFudXA6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZTogZnVuY3Rpb24gKGZ1bmMsIHNldF9jbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaVRTRk4uZ2V0RW52KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXRfY2xvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5nZXRNdXRleChmdW5jKS5leGVjdXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNldElzQ2xvc2luZyhmdW5jLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uZ2V0Q29uZChmdW5jKS5zaWduYWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRIYW5kbGVzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SGFuZGxlc0Nsb3NpbmcoZnVuYywgMSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmZpbmFsaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5jbG9zZVNjb3BlKGVudk9iamVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoT25lOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIHBvcHBlZF92YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBoYXNfbW9yZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBtdXRleCA9IGVtbmFwaVRTRk4uZ2V0TXV0ZXgoZnVuYyk7XG4gICAgICAgICAgICAgICAgdmFyIGNvbmQgPSBlbW5hcGlUU0ZOLmdldENvbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5jbG9zZUhhbmRsZXNBbmRNYXliZURlbGV0ZShmdW5jLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gZW1uYXBpVFNGTi5nZXRRdWV1ZVNpemUoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZW1uYXBpVFNGTi5zaGlmdFF1ZXVlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHBlZF92YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1heFF1ZXVlU2l6ZSA9IGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09PSBtYXhRdWV1ZVNpemUgJiYgbWF4UXVldWVTaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldFRocmVhZENvdW50KGZ1bmMpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uc2V0SXNDbG9zaW5nKGZ1bmMsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRNYXhRdWV1ZVNpemUoZnVuYykgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLnNpZ25hbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaVRTRk4uY2xvc2VIYW5kbGVzQW5kTWF5YmVEZWxldGUoZnVuYywgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvcHBlZF92YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZW52ID0gZW1uYXBpVFNGTi5nZXRFbnYoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3RfMSA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3RfMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0XzEuY2FsbGJhY2tJbnRvTW9kdWxlKGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxKc0NiID0gZW1uYXBpVFNGTi5nZXRDYWxsSlNDYihmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpVFNGTi5nZXRSZWYoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpzX2NhbGxiYWNrID0gcmVmID8gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmdldCgpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbEpzQ2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IGVtbmFwaVRTRk4uZ2V0Q29udGV4dChmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhc21UYWJsZS5nZXQoY2FsbEpzQ2IpKShlbnYsIGpzX2NhbGxiYWNrLCBjb250ZXh0LCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc0NhbGxiYWNrID0ganNfY2FsbGJhY2sgPyBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX2NhbGxiYWNrKS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBlbW5hcGlUU0ZOLmdldFJlc291cmNlKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV92YWx1ZSA9IGVtbmFwaUN0eC5yZWZTdG9yZS5nZXQocmVzb3VyY2UpLmdldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgZiwgW10sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogdmlldy5nZXRGbG9hdDY0KGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJBc3luY0lkOiB2aWV3LmdldEZsb2F0NjQoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LnRyaWdnZXJfYXN5bmNfaWQsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3RfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc19tb3JlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgICAgIHZhciBoYXNfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbnNfbGVmdCA9IDEwMDA7XG4gICAgICAgICAgICAgICAgdmFyIHVpMzJhID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAoZnVuYyArIGVtbmFwaVRTRk4ub2Zmc2V0LmRpc3BhdGNoX3N0YXRlKSA+PiAyO1xuICAgICAgICAgICAgICAgIHdoaWxlIChoYXNfbW9yZSAmJiAtLWl0ZXJhdGlvbnNfbGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKHVpMzJhLCBpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGhhc19tb3JlID0gZW1uYXBpVFNGTi5kaXNwYXRjaE9uZShmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEF0b21pY3MuZXhjaGFuZ2UodWkzMmEsIGluZGV4LCAwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzX21vcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChoYXNfbW9yZSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNlbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfc3RhdGUgPSBBdG9taWNzLm9yKG5ldyBVaW50MzJBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlciksIChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuZGlzcGF0Y2hfc3RhdGUpID4+IDIsIDEgPDwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKChjdXJyZW50X3N0YXRlICYgMSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBFTlZJUk9OTUVOVF9JU19QVEhSRUFEICE9PSAndW5kZWZpbmVkJykgJiYgRU5WSVJPTk1FTlRfSVNfUFRIUkVBRCkge1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RzZm4tc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2ZuOiBmdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5mZWF0dXJlLnNldEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmRpc3BhdGNoKGZ1bmMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb24oZW52LCBmdW5jLCBhc3luY19yZXNvdXJjZSwgYXN5bmNfcmVzb3VyY2VfbmFtZSwgbWF4X3F1ZXVlX3NpemUsIGluaXRpYWxfdGhyZWFkX2NvdW50LCB0aHJlYWRfZmluYWxpemVfZGF0YSwgdGhyZWFkX2ZpbmFsaXplX2NiLCBjb250ZXh0LCBjYWxsX2pzX2NiLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXN5bmNfcmVzb3VyY2VfbmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgbWF4X3F1ZXVlX3NpemUgPSBtYXhfcXVldWVfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIGluaXRpYWxfdGhyZWFkX2NvdW50ID0gaW5pdGlhbF90aHJlYWRfY291bnQgPj4+IDA7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbF90aHJlYWRfY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciByZWYgPSAwO1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWxsX2pzX2NiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmNWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoZnVuYykudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmdW5jVmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHJlZiA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2UoZW52T2JqZWN0LCBmdW5jLCAxLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8pLmlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVzb3VyY2VPYmplY3Q7XG4gICAgICAgICAgICBpZiAoYXN5bmNfcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBhc3luY1Jlc291cmNlT2JqZWN0ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhc3luY19yZXNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jUmVzb3VyY2VPYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU9iamVjdCA9IE9iamVjdChhc3luY1Jlc291cmNlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFzeW5jUmVzb3VyY2VPYmplY3QgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChhc3luY1Jlc291cmNlT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhc3luY1Jlc291cmNlTmFtZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXN5bmNfcmVzb3VyY2VfbmFtZSkudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFzeW5jUmVzb3VyY2VOYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXN5bmNSZXNvdXJjZU5hbWUgPSBTdHJpbmcoYXN5bmNSZXNvdXJjZU5hbWUpO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlX25hbWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQoYXN5bmNSZXNvdXJjZU5hbWUpO1xuICAgICAgICAgICAgLy8gdHNmbiBjcmVhdGVcbiAgICAgICAgICAgIHZhciBzaXplb2ZUU0ZOID0gZW1uYXBpVFNGTi5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgdmFyIHRzZm4gPSBfbWFsbG9jKHNpemVvZlRTRk4pO1xuICAgICAgICAgICAgaWYgKCF0c2ZuKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KHRzZm4sIHRzZm4gKyBzaXplb2ZUU0ZOKS5maWxsKDApO1xuICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHJlc291cmNlLCAxLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHJlc291cmNlXyA9IHJlc291cmNlUmVmLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4sIHJlc291cmNlXywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaVRTRk4uaW5pdFF1ZXVlKHRzZm4pKSB7XG4gICAgICAgICAgICAgICAgX2ZyZWUodHNmbik7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2VSZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2VtbmFwaV9ub2RlX2VtaXRfYXN5bmNfaW5pdChyZXNvdXJjZSwgcmVzb3VyY2VfbmFtZSwgLTEsIHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19pZCk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LnRocmVhZF9jb3VudCwgaW5pdGlhbF90aHJlYWRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmNvbnRleHQsIGNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5tYXhfcXVldWVfc2l6ZSwgbWF4X3F1ZXVlX3NpemUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LnJlZiwgcmVmLCB0cnVlKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRzZm4gKyBlbW5hcGlUU0ZOLm9mZnNldC5lbnYsIGVudiwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMih0c2ZuICsgZW1uYXBpVFNGTi5vZmZzZXQuZmluYWxpemVfZGF0YSwgdGhyZWFkX2ZpbmFsaXplX2RhdGEsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmZpbmFsaXplX2NiLCB0aHJlYWRfZmluYWxpemVfY2IsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmNhbGxfanNfY2IsIGNhbGxfanNfY2IsIHRydWUpO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LmFkZENsZWFudXBIb29rKGVudk9iamVjdCwgZW1uYXBpVFNGTi5jbGVhbnVwLCB0c2ZuKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5yZWYoKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIodHNmbiArIGVtbmFwaVRTRk4ub2Zmc2V0LmFzeW5jX3JlZiwgMSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHRzZm4sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dChmdW5jLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZnVuYyB8fCAhcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBlbW5hcGlUU0ZOLmdldENvbnRleHQoZnVuYyk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBjb250ZXh0LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF90aHJlYWRzYWZlX2Z1bmN0aW9uKGZ1bmMsIGRhdGEsIG1vZGUpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLnB1c2goZnVuYywgZGF0YSwgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FjcXVpcmVfdGhyZWFkc2FmZV9mdW5jdGlvbihmdW5jKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgcmV0dXJuIG11dGV4LmV4ZWN1dGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTYgLyogbmFwaV9zdGF0dXMubmFwaV9jbG9zaW5nICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLmFkZFRocmVhZENvdW50KGZ1bmMpO1xuICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwaSAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3JlbGVhc2VfdGhyZWFkc2FmZV9mdW5jdGlvbihmdW5jLCBtb2RlKSB7XG4gICAgICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbXV0ZXggPSBlbW5hcGlUU0ZOLmdldE11dGV4KGZ1bmMpO1xuICAgICAgICAgICAgdmFyIGNvbmQgPSBlbW5hcGlUU0ZOLmdldENvbmQoZnVuYyk7XG4gICAgICAgICAgICByZXR1cm4gbXV0ZXguZXhlY3V0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaVRTRk4uZ2V0VGhyZWFkQ291bnQoZnVuYykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zdWJUaHJlYWRDb3VudChmdW5jKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpVFNGTi5nZXRUaHJlYWRDb3VudChmdW5jKSA9PT0gMCB8fCBtb2RlID09PSAxIC8qIG5hcGlfdGhyZWFkc2FmZV9mdW5jdGlvbl9yZWxlYXNlX21vZGUubmFwaV90c2ZuX2Fib3J0ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmcgPSBlbW5hcGlUU0ZOLmdldElzQ2xvc2luZyhmdW5jKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nsb3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0Nsb3NpbmdWYWx1ZSA9IChtb2RlID09PSAxIC8qIG5hcGlfdGhyZWFkc2FmZV9mdW5jdGlvbl9yZWxlYXNlX21vZGUubmFwaV90c2ZuX2Fib3J0ICovKSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpVFNGTi5zZXRJc0Nsb3NpbmcoZnVuYywgaXNDbG9zaW5nVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2xvc2luZ1ZhbHVlICYmIGVtbmFwaVRTRk4uZ2V0TWF4UXVldWVTaXplKGZ1bmMpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuc2lnbmFsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlUU0ZOLnNlbmQoZnVuYyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW5yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbihlbnYsIGZ1bmMpIHtcbiAgICAgICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgICAgICAgIGFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBhc3luY1JlZk9mZnNldCA9IChmdW5jICsgZW1uYXBpVFNGTi5vZmZzZXQuYXN5bmNfcmVmKSA+PiAyO1xuICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBJbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChBdG9taWNzLmxvYWQoYXJyLCBhc3luY1JlZk9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDApO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3JlZl90aHJlYWRzYWZlX2Z1bmN0aW9uKGVudiwgZnVuYykge1xuICAgICAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgICAgICAgYWJvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFzeW5jUmVmT2Zmc2V0ID0gKGZ1bmMgKyBlbW5hcGlUU0ZOLm9mZnNldC5hc3luY19yZWYpID4+IDI7XG4gICAgICAgICAgICB2YXIgYXJyID0gbmV3IEludDMyQXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFBdG9taWNzLmxvYWQoYXJyLCBhc3luY1JlZk9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBBdG9taWNzLnN0b3JlKGFyciwgYXN5bmNSZWZPZmZzZXQsIDEpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpQVdNVCA9IHtcbiAgICAgICAgICAgIHVudXNlZFdvcmtlcnM6IFtdLFxuICAgICAgICAgICAgcnVubmluZ1dvcmtlcnM6IFtdLFxuICAgICAgICAgICAgd29ya1F1ZXVlOiBbXSxcbiAgICAgICAgICAgIHdvcmtlclJlYWR5OiBudWxsLFxuICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgLyogbmFwaV9yZWYgKi8gcmVzb3VyY2U6IDAsXG4gICAgICAgICAgICAgICAgLyogZG91YmxlICovIGFzeW5jX2lkOiA4LFxuICAgICAgICAgICAgICAgIC8qIGRvdWJsZSAqLyB0cmlnZ2VyX2FzeW5jX2lkOiAxNixcbiAgICAgICAgICAgICAgICAvKiBuYXBpX2VudiAqLyBlbnY6IDI0LFxuICAgICAgICAgICAgICAgIC8qIHZvaWQqICovIGRhdGE6IDEgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9hc3luY19leGVjdXRlX2NhbGxiYWNrICovIGV4ZWN1dGU6IDIgKiA0ICsgMjQsXG4gICAgICAgICAgICAgICAgLyogbmFwaV9hc3luY19jb21wbGV0ZV9jYWxsYmFjayAqLyBjb21wbGV0ZTogMyAqIDQgKyAyNCxcbiAgICAgICAgICAgICAgICBlbmQ6IDQgKiA0ICsgMjRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2VycyA9IFtdO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlID0gW107XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdvcmtlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh3b3JrZXIuX2VtbmFwaUFXTVRMaXN0ZW5lcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEVOVklST05NRU5UX0lTX05PREUgPyBlIDogZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX19lbW5hcGlfXyA9IGRhdGEuX19lbW5hcGlfXztcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9fZW1uYXBpX18pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBfX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmRlY3JlYXNlV2FpdGluZ1JlcXVlc3RDb3VudGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5zcGxpY2UoZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5pbmRleE9mKHdvcmtlciksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQudW51c2VkV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNhbGxDb21wbGV0ZShwYXlsb2FkLndvcmssIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnYXN5bmMtd29yay1xdWV1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULnNjaGVkdWxlV29yayhwYXlsb2FkLndvcmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstY2FuY2VsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FuY2VsV29yayhwYXlsb2FkLndvcmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5vZmYoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXIuX2VtbmFwaUFXTVRMaXN0ZW5lcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdvcmtlci5fZW1uYXBpQVdNVExpc3RlbmVyID0geyBoYW5kbGVyOiBoYW5kbGVyLCBkaXNwb3NlOiBkaXNwb3NlIH07XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLm9uKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdFdvcmtlcnM6IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlBV01ULndvcmtlclJlYWR5IHx8IChlbW5hcGlBV01ULndvcmtlclJlYWR5ID0gUHJvbWlzZS5yZXNvbHZlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC53b3JrZXJSZWFkeSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUFXTVQud29ya2VyUmVhZHk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNyZWF0ZVdvcmtlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgb3B0aW9ucy5vbkNyZWF0ZVdvcmtlcmAgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoISgnZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGUnIGluIHdhc21JbnN0YW5jZS5leHBvcnRzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgZW1uYXBpX2FzeW5jX3dvcmtlcl9jcmVhdGVgIGlzIG5vdCBleHBvcnRlZCwgcGxlYXNlIHRyeSB0byBhZGQgYC0tZXhwb3J0PWVtbmFwaV9hc3luY193b3JrZXJfY3JlYXRlYCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5wdXNoKHdhc21JbnN0YW5jZS5leHBvcnRzLmVtbmFwaV9hc3luY193b3JrZXJfY3JlYXRlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gb25DcmVhdGVXb3JrZXIoeyB0eXBlOiAnYXN5bmMtd29yaycsIG5hbWU6ICdlbW5hcGktYXN5bmMtd29ya2VyJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gUFRocmVhZC5sb2FkV2FzbU1vZHVsZVRvV29ya2VyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmFkZExpc3RlbmVyKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3b3JrZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnVucmVmKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnB1c2god29ya2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnRocmVhZEJsb2NrQmFzZSA9IGFyZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29ya2VyLWluaXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGFyZzogYXJnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9sb29wXzEoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfZnJlZShhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrZXJSZWFkeSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpQVdNVC53b3JrZXJSZWFkeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGVja0lkbGVXb3JrZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLmxlbmd0aCA+IDAgJiYgZW1uYXBpQVdNVC53b3JrUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29ya2VyID0gZW1uYXBpQVdNVC51bnVzZWRXb3JrZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JrID0gZW1uYXBpQVdNVC53b3JrUXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5ydW5uaW5nV29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstZXhlY3V0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyB3b3JrOiB3b3JrIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFJlc291cmNlOiBmdW5jdGlvbiAod29yaykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlUU0ZOLmxvYWRTaXplVHlwZVZhbHVlKHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5yZXNvdXJjZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEV4ZWN1dGU6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmV4ZWN1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpVFNGTi5sb2FkU2l6ZVR5cGVWYWx1ZSh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQuY29tcGxldGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRFbnY6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmVudiwgZmFsc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldERhdGE6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVRTRk4ubG9hZFNpemVUeXBlVmFsdWUod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmRhdGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzY2hlZHVsZVdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIGlmIChFTlZJUk9OTUVOVF9JU19QVEhSRUFEKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZV8xID0gbmFwaU1vZHVsZS5wb3N0TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VfMSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2VtbmFwaV9fOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FzeW5jLXdvcmstcXVldWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQud29ya1F1ZXVlLnB1c2god29yayk7XG4gICAgICAgICAgICAgICAgaWYgKChfYSA9IGVtbmFwaUFXTVQud29ya2VyUmVhZHkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5yZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZhaWwgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlDdHguZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuaW5pdFdvcmtlcnMoX2VtbmFwaV9hc3luY193b3JrX3Bvb2xfc2l6ZSgpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULndvcmtlclJlYWR5LnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlBV01ULmNoZWNrSWRsZVdvcmtlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmFpbChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbmNlbFdvcms6IGZ1bmN0aW9uICh3b3JrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOVklST05NRU5UX0lTX1BUSFJFQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlXzIgPSBuYXBpTW9kdWxlLnBvc3RNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZV8yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9fZW1uYXBpX186IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jYW5jZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBlbW5hcGlBV01ULndvcmtRdWV1ZS5pbmRleE9mKHdvcmspO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC53b3JrUXVldWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmZlYXR1cmUuc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5kZWNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpQVdNVC5jaGVja0lkbGVXb3JrZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuY2FsbENvbXBsZXRlKHdvcmssIDExIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2FuY2VsbGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiA5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhbGxDb21wbGV0ZTogZnVuY3Rpb24gKHdvcmssIHN0YXR1cykge1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGV0ZSA9IGVtbmFwaUFXTVQuZ2V0Q29tcGxldGUod29yayk7XG4gICAgICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZW1uYXBpQVdNVC5nZXREYXRhKHdvcmspO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZW52T2JqZWN0LmNhbGxiYWNrSW50b01vZHVsZSh0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAod2FzbVRhYmxlLmdldChjb21wbGV0ZSkpKGVudiwgc3RhdHVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW1uYXBpTm9kZUJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VfdmFsdWUgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlc291cmNlKS5nZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZU9iamVjdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb3VyY2VfdmFsdWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzeW5jSWQgPSB2aWV3LmdldEZsb2F0NjQod29yayArIGVtbmFwaUFXTVQub2Zmc2V0LmFzeW5jX2lkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbW5hcGlOb2RlQmluZGluZy5ub2RlLm1ha2VDYWxsYmFjayhyZXNvdXJjZU9iamVjdCwgY2FsbGJhY2ssIFtdLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNJZDogYXN5bmNJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQXN5bmNJZDogdHJpZ2dlckFzeW5jSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHBwICovXG4gICAgICAgIHZhciBuYXBpX2NyZWF0ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlTmFtZSA9IFN0cmluZyhlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlX25hbWUpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIGlkID0gZW1uYXBpQVdTVC5jcmVhdGUoZW52LCByZXNvdXJjZU9iamVjdCwgcmVzb3VyY2VOYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IGZ1bmN0aW9uIChlbnYsIHJlc291cmNlLCByZXNvdXJjZV9uYW1lLCBleGVjdXRlLCBjb21wbGV0ZSwgZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlT2JqZWN0O1xuICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IE9iamVjdChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlc291cmNlKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU9iamVjdCA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVvZkFXID0gZW1uYXBpQVdNVC5vZmZzZXQuZW5kO1xuICAgICAgICAgICAgICAgIHZhciBhdyA9IF9tYWxsb2Moc2l6ZW9mQVcpO1xuICAgICAgICAgICAgICAgIGlmICghYXcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShhdywgYXcgKyBzaXplb2ZBVykuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXNvdXJjZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc291cmNlUmVmID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZShlbnZPYmplY3QsIHMsIDEsIDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZV8gPSByZXNvdXJjZVJlZi5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3LCByZXNvdXJjZV8sIHRydWUpO1xuICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2luaXQocywgcmVzb3VyY2VfbmFtZSwgLTEsIGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuYXN5bmNfaWQpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZW52LCBlbnYsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZXhlY3V0ZSwgZXhlY3V0ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXcgKyBlbW5hcGlBV01ULm9mZnNldC5jb21wbGV0ZSwgY29tcGxldGUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGF3ICsgZW1uYXBpQVdNVC5vZmZzZXQuZGF0YSwgZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCBhdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgdmFyIG5hcGlfZGVsZXRlX2FzeW5jX3dvcmsgPSBzaW5nbGVUaHJlYWRBc3luY1dvcmtcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXU1QucmVtb3ZlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZSA9IGVtbmFwaUFXTVQuZ2V0UmVzb3VyY2Uod29yayk7XG4gICAgICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZXNvdXJjZSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhc3luY0lkID0gdmlldy5nZXRGbG9hdDY0KHdvcmsgKyBlbW5hcGlBV01ULm9mZnNldC5hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyQXN5bmNJZCA9IHZpZXcuZ2V0RmxvYXQ2NCh3b3JrICsgZW1uYXBpQVdNVC5vZmZzZXQudHJpZ2dlcl9hc3luY19pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIF9lbW5hcGlfbm9kZV9lbWl0X2FzeW5jX2Rlc3Ryb3koYXN5bmNJZCwgdHJpZ2dlckFzeW5jSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfZnJlZSh3b3JrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICB2YXIgbmFwaV9xdWV1ZV9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBlbW5hcGlBV1NULnF1ZXVlKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVtbmFwaUFXTVQuc2NoZWR1bGVXb3JrKHdvcmspO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIHZhciBuYXBpX2NhbmNlbF9hc3luY193b3JrID0gc2luZ2xlVGhyZWFkQXN5bmNXb3JrXG4gICAgICAgICAgICA/IGZ1bmN0aW9uIChlbnYsIHdvcmspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGlmICghd29yaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gZW1uYXBpQVdTVC5jYW5jZWwod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGVudiwgd29yaykge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICAgICAgaWYgKCF3b3JrKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBlbW5hcGlBV01ULmNhbmNlbFdvcmsod29yayk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3Ioc3RhdHVzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIGluaXRXb3JrZXIoc3RhcnRBcmcpIHtcbiAgICAgICAgICAgIGlmIChuYXBpTW9kdWxlLmNoaWxkVGhyZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3YXNtSW5zdGFuY2UuZXhwb3J0cy5lbW5hcGlfYXN5bmNfd29ya2VyX2luaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYGVtbmFwaV9hc3luY193b3JrZXJfaW5pdGAgaXMgbm90IGV4cG9ydGVkLCBwbGVhc2UgdHJ5IHRvIGFkZCBgLS1leHBvcnQ9ZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0YCB0byBsaW5rZXIgZmxhZ3MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2FzbUluc3RhbmNlLmV4cG9ydHMuZW1uYXBpX2FzeW5jX3dvcmtlcl9pbml0KHN0YXJ0QXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnRUaHJlYWQgaXMgb25seSBhdmFpbGFibGUgaW4gY2hpbGQgdGhyZWFkcycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4ZWN1dGVBc3luY1dvcmsod29yaykge1xuICAgICAgICAgICAgaWYgKCFFTlZJUk9OTUVOVF9JU19QVEhSRUFEKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBleGVjdXRlID0gZW1uYXBpQVdNVC5nZXRFeGVjdXRlKHdvcmspO1xuICAgICAgICAgICAgdmFyIGVudiA9IGVtbmFwaUFXTVQuZ2V0RW52KHdvcmspO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBlbW5hcGlBV01ULmdldERhdGEod29yayk7XG4gICAgICAgICAgICAod2FzbVRhYmxlLmdldChleGVjdXRlKSkoZW52LCBkYXRhKTtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZSA9IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2U7XG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgX19lbW5hcGlfXzoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXN5bmMtd29yay1jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgd29yazogd29yayB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZS5pbml0V29ya2VyID0gaW5pdFdvcmtlcjtcbiAgICAgICAgbmFwaU1vZHVsZS5leGVjdXRlQXN5bmNXb3JrID0gZXhlY3V0ZUFzeW5jV29yaztcbiAgICAgICAgdmFyIGFzeW5jV29ya01vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbmNlbF9hc3luY193b3JrOiBuYXBpX2NhbmNlbF9hc3luY193b3JrLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfYXN5bmNfd29yazogbmFwaV9jcmVhdGVfYXN5bmNfd29yayxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX2FzeW5jX3dvcms6IG5hcGlfZGVsZXRlX2FzeW5jX3dvcmssXG4gICAgICAgICAgICBuYXBpX3F1ZXVlX2FzeW5jX3dvcms6IG5hcGlfcXVldWVfYXN5bmNfd29ya1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX2RlcHMgbWFsbG9jXG4gICAgICAgICAqIEBfX2RlcHMgZnJlZVxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGVtbmFwaUV4dGVybmFsTWVtb3J5ID0ge1xuICAgICAgICAgICAgcmVnaXN0cnk6IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRhYmxlOiBuZXcgV2Vha01hcCgpLFxuICAgICAgICAgICAgd2FzbU1lbW9yeVZpZXdUYWJsZTogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA9IHR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeSA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoX3BvaW50ZXIpIHsgX2ZyZWUoX3BvaW50ZXIpOyB9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNEZXRhY2hlZEFycmF5QnVmZmVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0QXJyYXlCdWZmZXJQb2ludGVyOiBmdW5jdGlvbiAoYXJyYXlCdWZmZXIsIHNob3VsZENvcHkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgdmFyIGluZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IDAsXG4gICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sXG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChhcnJheUJ1ZmZlciA9PT0gd2FzbU1lbW9yeS5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpc0RldGFjaGVkID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpRXh0ZXJuYWxNZW1vcnkudGFibGUuaGFzKGFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVkSW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLmdldChhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRJbmZvLmFkZHJlc3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZENvcHkgJiYgY2FjaGVkSW5mby5vd25lcnNoaXAgPT09IDAgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtSdW50aW1lICovICYmIGNhY2hlZEluZm8ucnVudGltZUFsbG9jYXRlZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciksIGNhY2hlZEluZm8uYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc0RldGFjaGVkIHx8IChhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IF9tYWxsb2MoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ091dCBvZiBtZW1vcnknKTtcbiAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgaW5mby5hZGRyZXNzID0gcG9pbnRlcjtcbiAgICAgICAgICAgICAgICBpbmZvLm93bmVyc2hpcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5ID8gMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICAgICAgaW5mby5ydW50aW1lQWxsb2NhdGVkID0gMTtcbiAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS50YWJsZS5zZXQoYXJyYXlCdWZmZXIsIGluZm8pO1xuICAgICAgICAgICAgICAgIChfYSA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LnJlZ2lzdHJ5KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmVnaXN0ZXIoYXJyYXlCdWZmZXIsIHBvaW50ZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE9yVXBkYXRlTWVtb3J5VmlldzogZnVuY3Rpb24gKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXModmlldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiB2aWV3LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHZpZXcuYnl0ZU9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHZpZXcgaW5zdGFuY2VvZiBEYXRhVmlldyA/IHZpZXcuYnl0ZUxlbmd0aCA6IHZpZXcubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPbGRXYXNtTWVtb3J5ID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuaXNEZXRhY2hlZEFycmF5QnVmZmVyKHZpZXcuYnVmZmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiYgKHZpZXcuYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAobWF5YmVPbGRXYXNtTWVtb3J5ICYmIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKHZpZXcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmZvID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBDdG9yID0gaW5mby5DdG9yO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VmlldyA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEJ1ZmZlcl8xID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEJ1ZmZlcl8xID09PSAnZnVuY3Rpb24nICYmIEN0b3IgPT09IEJ1ZmZlcl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gQnVmZmVyXzEuZnJvbSh3YXNtTWVtb3J5LmJ1ZmZlciwgaW5mby5hZGRyZXNzLCBpbmZvLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3ID0gbmV3IEN0b3Iod2FzbU1lbW9yeS5idWZmZXIsIGluZm8uYWRkcmVzcywgaW5mby5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KG5ld1ZpZXcsIGluZm8pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmlldztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZXc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0Vmlld1BvaW50ZXI6IGZ1bmN0aW9uICh2aWV3LCBzaG91bGRDb3B5KSB7XG4gICAgICAgICAgICAgICAgdmlldyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldE9yVXBkYXRlTWVtb3J5Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICBpZiAodmlldy5idWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyh2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5nZXQodmlldyksIGFkZHJlc3NfMSA9IF9hLmFkZHJlc3MsIG93bmVyc2hpcF8xID0gX2Eub3duZXJzaGlwLCBydW50aW1lQWxsb2NhdGVkXzEgPSBfYS5ydW50aW1lQWxsb2NhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgYWRkcmVzczogYWRkcmVzc18xLCBvd25lcnNoaXA6IG93bmVyc2hpcF8xLCBydW50aW1lQWxsb2NhdGVkOiBydW50aW1lQWxsb2NhdGVkXzEsIHZpZXc6IHZpZXcgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBhZGRyZXNzOiB2aWV3LmJ5dGVPZmZzZXQsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwLCB2aWV3OiB2aWV3IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBfYiA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcih2aWV3LmJ1ZmZlciwgc2hvdWxkQ29weSksIGFkZHJlc3MgPSBfYi5hZGRyZXNzLCBvd25lcnNoaXAgPSBfYi5vd25lcnNoaXAsIHJ1bnRpbWVBbGxvY2F0ZWQgPSBfYi5ydW50aW1lQWxsb2NhdGVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGFkZHJlc3M6IGFkZHJlc3MgPT09IDAgPyAwIDogKGFkZHJlc3MgKyB2aWV3LmJ5dGVPZmZzZXQpLCBvd25lcnNoaXA6IG93bmVyc2hpcCwgcnVudGltZUFsbG9jYXRlZDogcnVudGltZUFsbG9jYXRlZCwgdmlldzogdmlldyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19wb3N0c2V0XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBlbW5hcGlTdHJpbmcuaW5pdCgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIHZhciBlbW5hcGlTdHJpbmcgPSB7XG4gICAgICAgICAgICB1dGY4RGVjb2RlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdXRmMTZEZWNvZGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZhbGxiYWNrRGVjb2RlciA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwZW5kaW5nU2l6ZSA9IE1hdGgubWluKDB4MTAwMCwgYnl0ZXMubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZyA9IG5ldyBVaW50MTZBcnJheShwZW5kaW5nU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGVuZGluZ0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9yZSA9IGlucHV0SW5kZXggPCBieXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3JlIHx8IChwZW5kaW5nSW5kZXggPj0gcGVuZGluZ1NpemUgLSAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViYXJyYXkgPSBwZW5kaW5nLnN1YmFycmF5KDAsIHBlbmRpbmdJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheWxpa2UgPSBzdWJhcnJheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheWxpa2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2h1bmtzLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gYnl0ZXMuc3ViYXJyYXkoaW5wdXRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTEgPSBieXRlc1tpbnB1dEluZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYnl0ZTEgJiAweDgwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IGJ5dGUxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoYnl0ZTEgJiAweGUwKSA9PT0gMHhjMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTIgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1twZW5kaW5nSW5kZXgrK10gPSAoKGJ5dGUxICYgMHgxZikgPDwgNikgfCBieXRlMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMyA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9ICgoYnl0ZTEgJiAweDFmKSA8PCAxMikgfCAoYnl0ZTIgPDwgNikgfCBieXRlMztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGJ5dGUxICYgMHhmOCkgPT09IDB4ZjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUyID0gYnl0ZXNbaW5wdXRJbmRleCsrXSAmIDB4M2Y7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBieXRlMyA9IGJ5dGVzW2lucHV0SW5kZXgrK10gJiAweDNmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnl0ZTQgPSBieXRlc1tpbnB1dEluZGV4KytdICYgMHgzZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVwb2ludCA9ICgoYnl0ZTEgJiAweDA3KSA8PCAweDEyKSB8IChieXRlMiA8PCAweDBjKSB8IChieXRlMyA8PCAweDA2KSB8IGJ5dGU0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXBvaW50ID4gMHhmZmZmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcG9pbnQgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdbcGVuZGluZ0luZGV4KytdID0gKGNvZGVwb2ludCA+Pj4gMTApICYgMHgzZmYgfCAweGQ4MDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlcG9pbnQgPSAweGRjMDAgfCBjb2RlcG9pbnQgJiAweDNmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nW3BlbmRpbmdJbmRleCsrXSA9IGNvZGVwb2ludDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciB1dGY4RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB1dGY4RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RGVjb2RlcigpIDogZmFsbGJhY2tEZWNvZGVyO1xuICAgICAgICAgICAgICAgIGVtbmFwaVN0cmluZy51dGY4RGVjb2RlciA9IHV0ZjhEZWNvZGVyO1xuICAgICAgICAgICAgICAgIHZhciBmYWxsYmFja0RlY29kZXIyID0ge1xuICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQxNkFycmF5KGlucHV0LmJ1ZmZlciwgaW5wdXQuYnl0ZU9mZnNldCwgaW5wdXQuYnl0ZUxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA8PSAweDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IE1hdGgubWluKDB4MTAwMCwgYnl0ZXMubGVuZ3RoIC0gaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcy5zdWJhcnJheShpLCBpICsgbGVuKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHV0ZjE2RGVjb2RlcjtcbiAgICAgICAgICAgICAgICB1dGYxNkRlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICdmdW5jdGlvbicgPyBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNmxlJykgOiBmYWxsYmFja0RlY29kZXIyO1xuICAgICAgICAgICAgICAgIGVtbmFwaVN0cmluZy51dGYxNkRlY29kZXIgPSB1dGYxNkRlY29kZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVuZ3RoQnl0ZXNVVEY4OiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGM7XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4rKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjIDw9IDB4N0ZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gMztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFVURjhUb1N0cmluZzogZnVuY3Rpb24gKHB0ciwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwdHIgfHwgIWxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIHB0ciA+Pj49IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBIRUFQVThbZW5kXTspXG4gICAgICAgICAgICAgICAgICAgICAgICArK2VuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHB0ciArIChsZW5ndGggPj4+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBwdHI7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAxNikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gcHRyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggPCBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MCA9IEhFQVBVOFtpZHgrK107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh1MCAmIDB4ODApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUxID0gSEVBUFU4W2lkeCsrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1MCAmIDB4RTApID09PSAweEMwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKCh1MCAmIDMxKSA8PCA2KSB8IHUxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1MiA9IEhFQVBVOFtpZHgrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodTAgJiAweEYwKSA9PT0gMHhFMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUwID0gKCh1MCAmIDE1KSA8PCAxMikgfCAodTEgPDwgNikgfCB1MjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUwID0gKCh1MCAmIDcpIDw8IDE4KSB8ICh1MSA8PCAxMikgfCAodTIgPDwgNikgfCAoSEVBUFU4W2lkeCsrXSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1MCA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1MCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSB1MCAtIDB4MTAwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwIHwgKGNoID4+IDEwKSwgMHhEQzAwIHwgKGNoICYgMHgzRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLnV0ZjhEZWNvZGVyLmRlY29kZSgoKHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIEhFQVBVOC5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcikgfHwgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChIRUFQVTguYnVmZmVyKSA9PT0gXCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXVwiKSkgPyBIRUFQVTguc2xpY2UocHRyLCBlbmQpIDogSEVBUFU4LnN1YmFycmF5KHB0ciwgZW5kKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5nVG9VVEY4OiBmdW5jdGlvbiAoc3RyLCBvdXRQdHIsIG1heEJ5dGVzVG9Xcml0ZSkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQVTggPSBuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIG91dElkeCA9IG91dFB0cjtcbiAgICAgICAgICAgICAgICBvdXRJZHggPj4+PSAwO1xuICAgICAgICAgICAgICAgIGlmICghKG1heEJ5dGVzVG9Xcml0ZSA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJZHggPSBvdXRJZHg7XG4gICAgICAgICAgICAgICAgdmFyIGVuZElkeCA9IG91dElkeCArIG1heEJ5dGVzVG9Xcml0ZSAtIDE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPj0gMHhEODAwICYmIHUgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTEgPSBzdHIuY2hhckNvZGVBdCgrK2kpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdSA9IDB4MTAwMDAgKyAoKHUgJiAweDNGRikgPDwgMTApIHwgKHUxICYgMHgzRkYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh1IDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IHU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodSA8PSAweDdGRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dElkeCArIDEgPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4QzAgfCAodSA+PiA2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodSA8PSAweEZGRkYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRJZHggKyAyID49IGVuZElkeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweEUwIHwgKHUgPj4gMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4ODAgfCAoKHUgPj4gNikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICh1ICYgNjMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dElkeCArIDMgPj0gZW5kSWR4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUFU4W291dElkeCsrXSA9IDB4RjAgfCAodSA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICgodSA+PiAxMikgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQVThbb3V0SWR4KytdID0gMHg4MCB8ICgodSA+PiA2KSAmIDYzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEhFQVBVOFtvdXRJZHgrK10gPSAweDgwIHwgKHUgJiA2Myk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUFU4W291dElkeF0gPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRJZHggLSBzdGFydElkeDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBVVEYxNlRvU3RyaW5nOiBmdW5jdGlvbiAocHRyLCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXB0ciB8fCAhbGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgcHRyID4+Pj0gMDtcbiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcHRyO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBlbmQgPj4gMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoSEVBUFUxNltpZHhdKVxuICAgICAgICAgICAgICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IGlkeCA8PCAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gcHRyICsgKGxlbmd0aCA+Pj4gMCkgKiAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBwdHI7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAzMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkod2FzbU1lbW9yeS5idWZmZXIsIHB0ciwgbGVuZ3RoIC8gMikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIEhFQVBVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW1uYXBpU3RyaW5nLnV0ZjE2RGVjb2Rlci5kZWNvZGUoKCh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiBIRUFQVTguYnVmZmVyIGluc3RhbmNlb2YgU2hhcmVkQXJyYXlCdWZmZXIpIHx8IChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSEVBUFU4LmJ1ZmZlcikgPT09IFwiW29iamVjdCBTaGFyZWRBcnJheUJ1ZmZlcl1cIikpID8gSEVBUFU4LnNsaWNlKHB0ciwgZW5kKSA6IEhFQVBVOC5zdWJhcnJheShwdHIsIGVuZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmluZ1RvVVRGMTY6IGZ1bmN0aW9uIChzdHIsIG91dFB0ciwgbWF4Qnl0ZXNUb1dyaXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heEJ5dGVzVG9Xcml0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9Xcml0ZSA9IDB4N0ZGRkZGRkY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXhCeXRlc1RvV3JpdGUgPCAyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICBtYXhCeXRlc1RvV3JpdGUgLT0gMjtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRQdHIgPSBvdXRQdHI7XG4gICAgICAgICAgICAgICAgdmFyIG51bUNoYXJzVG9Xcml0ZSA9IChtYXhCeXRlc1RvV3JpdGUgPCBzdHIubGVuZ3RoICogMikgPyAobWF4Qnl0ZXNUb1dyaXRlIC8gMikgOiBzdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1DaGFyc1RvV3JpdGU7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlVW5pdCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQxNihvdXRQdHIsIGNvZGVVbml0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0UHRyICs9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDE2KG91dFB0ciwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dFB0ciAtIHN0YXJ0UHRyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ld1N0cmluZzogZnVuY3Rpb24gKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgc3RyaW5nTWFrZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgICAgIHZhciBhdXRvTGVuZ3RoID0gbGVuZ3RoID09PSAtMTtcbiAgICAgICAgICAgICAgICB2YXIgc2l6ZWxlbmd0aCA9IGxlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoYXV0b0xlbmd0aCB8fCAoc2l6ZWxlbmd0aCA8PSAyMTQ3NDgzNjQ3KSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHN0clZhbHVlID0gc3RyaW5nTWFrZXIoc3RyLCBhdXRvTGVuZ3RoLCBzaXplbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHN0clZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXdFeHRlcm5hbFN0cmluZzogZnVuY3Rpb24gKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCwgY3JlYXRlQXBpLCBzdHJpbmdNYWtlcikge1xuICAgICAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGF1dG9MZW5ndGggPSBsZW5ndGggPT09IC0xO1xuICAgICAgICAgICAgICAgIHZhciBzaXplbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIShhdXRvTGVuZ3RoIHx8IChzaXplbGVuZ3RoIDw9IDIxNDc0ODM2NDcpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gY3JlYXRlQXBpKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3BpZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGNvcGllZCwgMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2FsbEZpbmFsaXplcihmaW5hbGl6ZV9jYWxsYmFjaywgc3RyLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2FycmF5X2xlbmd0aChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig4IC8qIG5hcGlfc3RhdHVzLm5hcGlfYXJyYXlfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBoYW5kbGUudmFsdWUubGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9hcnJheWJ1ZmZlcl9pbmZvKGVudiwgYXJyYXlidWZmZXIsIGRhdGEsIGJ5dGVfbGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0FycmF5QnVmZmVyKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0QXJyYXlCdWZmZXJQb2ludGVyKGhhbmRsZS52YWx1ZSwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChieXRlX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX2xlbmd0aCwgaGFuZGxlLnZhbHVlLmJ5dGVMZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfcHJvdG90eXBlKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaGFuZGxlLmlzT2JqZWN0KCkgfHwgaGFuZGxlLmlzRnVuY3Rpb24oKSA/IGhhbmRsZS52YWx1ZSA6IE9iamVjdChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciBwID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHAsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdHlwZWRhcnJheV9pbmZvKGVudiwgdHlwZWRhcnJheSwgdHlwZSwgbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdHlwZWRhcnJheSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodHlwZWRhcnJheSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc1R5cGVkQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgSW50OEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50OF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSAyIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEludDE2QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgSW50MzJBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gNSAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgVWludDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDYgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV91aW50MzJfYXJyYXkgKi87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDcgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9mbG9hdDMyX2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdCA9IDEwIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfYmlndWludDY0X2FycmF5ICovO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHR5cGUsIHQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihsZW5ndGgsIHYubGVuZ3RoLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBidWZmZXI7XG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHYuYnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcih2LCB0cnVlKS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkYXRhLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5YnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFiID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyLCBhYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVfb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGJ5dGVfb2Zmc2V0LCB2LmJ5dGVPZmZzZXQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvKGVudiwgYnVmZmVyLCBkYXRhLCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYnVmZmVyKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChidWZmZXIpO1xuICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNCdWZmZXIoZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKGhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFwaV9nZXRfZGF0YXZpZXdfaW5mbyhlbnYsIGJ1ZmZlciwgbGVuZ3RoLCBkYXRhLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuYXBpX2dldF90eXBlZGFycmF5X2luZm8oZW52LCBidWZmZXIsIDAsIGxlbmd0aCwgZGF0YSwgMCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9kYXRhdmlld19pbmZvKGVudiwgZGF0YXZpZXcsIGJ5dGVfbGVuZ3RoLCBkYXRhLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZGF0YXZpZXcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRhdGF2aWV3KTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0YVZpZXcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdiA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYnl0ZV9sZW5ndGgsIHYuYnl0ZUxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICAgICAgaWYgKGRhdGEgfHwgYXJyYXlidWZmZXIpIHtcbiAgICAgICAgICAgICAgICBidWZmZXIgPSB2LmJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBwID0gZW1uYXBpRXh0ZXJuYWxNZW1vcnkuZ2V0Vmlld1BvaW50ZXIodiwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgcCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhcnJheWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhciBhYiA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcnJheWJ1ZmZlciwgYWIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChieXRlX29mZnNldCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihieXRlX29mZnNldCwgdi5ieXRlT2Zmc2V0LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X2RhdGVfdmFsdWUoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzRGF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgPSBoYW5kbGUudmFsdWUudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0RmxvYXQ2NChyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9ib29sKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig3IC8qIG5hcGlfc3RhdHVzLm5hcGlfYm9vbGVhbl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGhhbmRsZS52YWx1ZSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEZsb2F0NjQocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfaW50NjQoZW52LCB2YWx1ZSwgcmVzdWx0LCBsb3NzbGVzcykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFsb3NzbGVzcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW1iZXJWYWx1ZSAhPT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoKG51bWJlclZhbHVlID49IChCaWdJbnQoLTEpICogKEJpZ0ludCgxKSA8PCBCaWdJbnQoNjMpKSkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDYzKSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJWYWx1ZSA+PSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2MykpKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclZhbHVlID0gbnVtYmVyVmFsdWUgLSAoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBsb3cgPSBOdW1iZXIobnVtYmVyVmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhpZ2ggPSBOdW1iZXIobnVtYmVyVmFsdWUgPj4gQmlnSW50KDMyKSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQgKyA0LCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9iaWdpbnRfdWludDY0KGVudiwgdmFsdWUsIHJlc3VsdCwgbG9zc2xlc3MpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghbG9zc2xlc3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbnVtYmVyVmFsdWUgIT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNiAvKiBuYXBpX3N0YXR1cy5uYXBpX251bWJlcl9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgaWYgKChudW1iZXJWYWx1ZSA+PSBCaWdJbnQoMCkpICYmIChudW1iZXJWYWx1ZSA8IChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChsb3NzbGVzcywgMSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGxvc3NsZXNzLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBudW1iZXJWYWx1ZSA9IG51bWJlclZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGxvdyA9IE51bWJlcihudW1iZXJWYWx1ZSAmIEJpZ0ludCgweGZmZmZmZmZmKSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcihudW1iZXJWYWx1ZSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0ICsgNCwgaGlnaCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkcyhlbnYsIHZhbHVlLCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCF3b3JkX2NvdW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTcgLyogbmFwaV9zdGF0dXMubmFwaV9iaWdpbnRfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGlzTWludXMgPSBoYW5kbGUudmFsdWUgPCBCaWdJbnQoMCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgdmFyIHdvcmRfY291bnRfaW50ID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRfY291bnQsIHRydWUpO1xuICAgICAgICAgICAgdmFyIHdvcmRDb3VudCA9IDA7XG4gICAgICAgICAgICB2YXIgYmlnaW50VmFsdWUgPSBpc01pbnVzID8gKGhhbmRsZS52YWx1ZSAqIEJpZ0ludCgtMSkpIDogaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICB3b3JkQ291bnQrKztcbiAgICAgICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGJpZ2ludFZhbHVlID4+IEJpZ0ludCg2NCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaWdpbnRWYWx1ZSA9IGlzTWludXMgPyAoaGFuZGxlLnZhbHVlICogQmlnSW50KC0xKSkgOiBoYW5kbGUudmFsdWU7XG4gICAgICAgICAgICBpZiAoIXNpZ25fYml0ICYmICF3b3Jkcykge1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnRfaW50ID0gd29yZENvdW50O1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkX2NvdW50LCB3b3JkX2NvdW50X2ludCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNpZ25fYml0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghd29yZHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIHdvcmRzQXJyID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKGJpZ2ludFZhbHVlICE9PSBCaWdJbnQoMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVpbnQ2NCA9IGJpZ2ludFZhbHVlICYgKChCaWdJbnQoMSkgPDwgQmlnSW50KDY0KSkgLSBCaWdJbnQoMSkpO1xuICAgICAgICAgICAgICAgICAgICB3b3Jkc0Fyci5wdXNoKHVpbnQ2NCk7XG4gICAgICAgICAgICAgICAgICAgIGJpZ2ludFZhbHVlID0gYmlnaW50VmFsdWUgPj4gQmlnSW50KDY0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHdvcmRfY291bnRfaW50LCB3b3Jkc0Fyci5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgbG93ID0gTnVtYmVyKHdvcmRzQXJyW2ldICYgQmlnSW50KDB4ZmZmZmZmZmYpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGlnaCA9IE51bWJlcih3b3Jkc0FycltpXSA+PiBCaWdJbnQoMzIpKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRzICsgaSAqIDgsIGxvdywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMih3b3JkcyArIChpICogOCArIDQpLCBoaWdoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoc2lnbl9iaXQsIGlzTWludXMgPyAxIDogMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHdvcmRfY291bnQsIGxlbiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9leHRlcm5hbChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0V4dGVybmFsKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHAgPSBoYW5kbGUuZGF0YSgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9pbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IEludDMyQXJyYXkoW2hhbmRsZS52YWx1ZV0pWzBdO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9pbnQ2NChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBudW1iZXJWYWx1ZSA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAobnVtYmVyVmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCBudW1iZXJWYWx1ZSA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIHx8IGlzTmFOKG51bWJlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0ICsgNCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChudW1iZXJWYWx1ZSA8IC8qIElOVDY0X1JBTkdFX05FR0FUSVZFICovIC05MjIzMzcyMDM2ODU0Nzc2ZTMpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCArIDQsIDIxNDc0ODM2NDgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobnVtYmVyVmFsdWUgPj0gLyogSU5UNjRfUkFOR0VfUE9TSVRJVkUgKi8gOTIyMzM3MjAzNjg1NDc3NjAwMCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDQyOTQ5NjcyOTUsIHRydWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQgKyA0LCAyMTQ3NDgzNjQ3LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICRlbW5hcGlTZXRWYWx1ZUk2NChyZXN1bHQsIE1hdGgudHJ1bmMobnVtYmVyVmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMShlbnYsIHZhbHVlLCBidWYsIGJ1Zl9zaXplLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGJ1Zl9zaXplID0gYnVmX3NpemUgPj4+IDA7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIGhhbmRsZS52YWx1ZS5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYnVmX3NpemUgIT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zl9zaXplIC0gMTsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZS5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDgoYnVmICsgaSwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgY29waWVkKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQ4KGJ1ZiArIGNvcGllZCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIDAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF92YWx1ZV9zdHJpbmdfdXRmOChlbnYsIHZhbHVlLCBidWYsIGJ1Zl9zaXplLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGJ1Zl9zaXplID0gYnVmX3NpemUgPj4+IDA7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgc3RyTGVuZ3RoID0gZW1uYXBpU3RyaW5nLmxlbmd0aEJ5dGVzVVRGOChoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldFVpbnQzMihyZXN1bHQsIHN0ckxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gZW1uYXBpU3RyaW5nLnN0cmluZ1RvVVRGOChoYW5kbGUudmFsdWUsIGJ1ZiwgYnVmX3NpemUpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY29waWVkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2KGVudiwgdmFsdWUsIGJ1ZiwgYnVmX3NpemUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgYnVmX3NpemUgPSBidWZfc2l6ZSA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghYnVmKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgaGFuZGxlLnZhbHVlLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChidWZfc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgY29waWVkID0gZW1uYXBpU3RyaW5nLnN0cmluZ1RvVVRGMTYoaGFuZGxlLnZhbHVlLCBidWYsIGJ1Zl9zaXplICogMik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3BpZWQgLyAyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZhbHVlX3VpbnQzMihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZS52YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig2IC8qIG5hcGlfc3RhdHVzLm5hcGlfbnVtYmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2ID0gbmV3IFVpbnQzMkFycmF5KFtoYW5kbGUudmFsdWVdKVswXTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udmVydDJjTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2FycmF5X2xlbmd0aDogbmFwaV9nZXRfYXJyYXlfbGVuZ3RoLFxuICAgICAgICAgICAgbmFwaV9nZXRfYXJyYXlidWZmZXJfaW5mbzogbmFwaV9nZXRfYXJyYXlidWZmZXJfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2J1ZmZlcl9pbmZvOiBuYXBpX2dldF9idWZmZXJfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2RhdGF2aWV3X2luZm86IG5hcGlfZ2V0X2RhdGF2aWV3X2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9kYXRlX3ZhbHVlOiBuYXBpX2dldF9kYXRlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9nZXRfcHJvdG90eXBlOiBuYXBpX2dldF9wcm90b3R5cGUsXG4gICAgICAgICAgICBuYXBpX2dldF90eXBlZGFycmF5X2luZm86IG5hcGlfZ2V0X3R5cGVkYXJyYXlfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF9pbnQ2NDogbmFwaV9nZXRfdmFsdWVfYmlnaW50X2ludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYmlnaW50X3VpbnQ2NDogbmFwaV9nZXRfdmFsdWVfYmlnaW50X3VpbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2JpZ2ludF93b3JkczogbmFwaV9nZXRfdmFsdWVfYmlnaW50X3dvcmRzLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfYm9vbDogbmFwaV9nZXRfdmFsdWVfYm9vbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX2RvdWJsZTogbmFwaV9nZXRfdmFsdWVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfZXh0ZXJuYWw6IG5hcGlfZ2V0X3ZhbHVlX2V4dGVybmFsLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfaW50MzI6IG5hcGlfZ2V0X3ZhbHVlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfaW50NjQ6IG5hcGlfZ2V0X3ZhbHVlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMTogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGYxNjogbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfc3RyaW5nX3V0Zjg6IG5hcGlfZ2V0X3ZhbHVlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9nZXRfdmFsdWVfdWludDMyOiBuYXBpX2dldF92YWx1ZV91aW50MzJcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfaW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV91aW50MzIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUgPj4+IDApLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9pbnQ2NChlbnYsIGxvdywgaGlnaCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWhpZ2gpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyKGxvdyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjEgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGhpZ2gsIHYxLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwZHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2RvdWJsZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9zdHJpbmdfbGF0aW4xKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0LCBmdW5jdGlvbiAoc3RyLCBhdXRvTGVuZ3RoLCBzaXplTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxhdGluMVN0cmluZyA9ICcnO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGF1dG9MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IEhFQVBfREFUQV9WSUVXLmdldFVpbnQ4KHN0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0aW4xU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPCBzaXplTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50OChzdHIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGluMVN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGluMVN0cmluZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3U3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuVVRGMTZUb1N0cmluZyhzdHIsIGxlbmd0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3U3RyaW5nKGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCwgZnVuY3Rpb24gKHN0cikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHN0ciwgbGVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9leHRlcm5hbF9zdHJpbmdfbGF0aW4xKGVudiwgc3RyLCBsZW5ndGgsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQsIGNvcGllZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaVN0cmluZy5uZXdFeHRlcm5hbFN0cmluZyhlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQsIG5hcGlfY3JlYXRlX3N0cmluZ19sYXRpbjEsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ191dGYxNihlbnYsIHN0ciwgbGVuZ3RoLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfaGludCwgcmVzdWx0LCBjb3BpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubmV3RXh0ZXJuYWxTdHJpbmcoZW52LCBzdHIsIGxlbmd0aCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2hpbnQsIHJlc3VsdCwgY29waWVkLCBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmMTYsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV9sYXRpbjEoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMShlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuYXBpX2NyZWF0ZV9zdHJpbmdfdXRmOChlbnYsIHN0ciwgbGVuZ3RoLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmMTYoZW52LCBzdHIsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2KGVudiwgc3RyLCBsZW5ndGgsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQoZW52LCBsb3csIGhpZ2gsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWhpZ2gpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhbHVlID0gbG93O1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYxID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihoaWdoLCB2MSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGpwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfdWludDY0KGVudiwgbG93LCBoaWdoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydEJpZ0ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoaWdoKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YWx1ZSA9IGxvdyAmICgoQmlnSW50KDEpIDw8IEJpZ0ludCg2NCkpIC0gQmlnSW50KDEpKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2MSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZSh2YWx1ZSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoaGlnaCwgdjEsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHMoZW52LCBzaWduX2JpdCwgd29yZF9jb3VudCwgd29yZHMsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHYsIGk7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRCaWdJbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHdvcmRfY291bnQgPSB3b3JkX2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmICh3b3JkX2NvdW50ID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAod29yZF9jb3VudCA+ICgxMDI0ICogMTAyNCAvICg0ICogOCkgLyAyKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWF4aW11bSBCaWdJbnQgc2l6ZSBleGNlZWRlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBCaWdJbnQoMCk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd29yZF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb3cgPSBIRUFQX0RBVEFfVklFVy5nZXRVaW50MzIod29yZHMgKyBpICogOCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoaWdoID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKHdvcmRzICsgKGkgKiA4ICsgNCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd29yZGkgPSBCaWdJbnQobG93KSB8IChCaWdJbnQoaGlnaCkgPDwgQmlnSW50KDMyKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IHdvcmRpIDw8IEJpZ0ludCg2NCAqIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSAqPSAoKEJpZ0ludChzaWduX2JpdCkgJSBCaWdJbnQoMikgPT09IEJpZ0ludCgwKSkgPyBCaWdJbnQoMSkgOiBCaWdJbnQoLTEpKTtcbiAgICAgICAgICAgICAgICB2ID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHZhbHVlKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbnZlcnQybmFwaU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfaW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF9pbnQ2NCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQ6IG5hcGlfY3JlYXRlX2JpZ2ludF91aW50NjQsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9iaWdpbnRfd29yZHM6IG5hcGlfY3JlYXRlX2JpZ2ludF93b3JkcyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RvdWJsZTogbmFwaV9jcmVhdGVfZG91YmxlLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50MzI6IG5hcGlfY3JlYXRlX2ludDMyLFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfaW50NjQ6IG5hcGlfY3JlYXRlX2ludDY0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMTogbmFwaV9jcmVhdGVfc3RyaW5nX2xhdGluMSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3N0cmluZ191dGYxNjogbmFwaV9jcmVhdGVfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3RyaW5nX3V0Zjg6IG5hcGlfY3JlYXRlX3N0cmluZ191dGY4LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfdWludDMyOiBuYXBpX2NyZWF0ZV91aW50MzIsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX2xhdGluMTogbm9kZV9hcGlfY3JlYXRlX2V4dGVybmFsX3N0cmluZ19sYXRpbjEsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2OiBub2RlX2FwaV9jcmVhdGVfZXh0ZXJuYWxfc3RyaW5nX3V0ZjE2LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV9sYXRpbjE6IG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfbGF0aW4xLFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNjogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGYxNixcbiAgICAgICAgICAgIG5vZGVfYXBpX2NyZWF0ZV9wcm9wZXJ0eV9rZXlfdXRmODogbm9kZV9hcGlfY3JlYXRlX3Byb3BlcnR5X2tleV91dGY4XG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gKCF1dGY4bmFtZSB8fCAhbGVuZ3RoKSA/ICcnIDogKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOG5hbWUsIGxlbmd0aCkpO1xuICAgICAgICAgICAgdmFyIGY7XG4gICAgICAgICAgICB2YXIgbmFwaUNhbGxiYWNrID0gKHdhc21UYWJsZS5nZXQoY2IpKTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmFwaUNhbGxiYWNrKGVudk9iamVjdC5pZCwgZW52T2JqZWN0LmN0eC5zY29wZVN0b3JlLmN1cnJlbnRTY29wZS5pZCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG1ha2VGdW5jdGlvbiA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNjb3BlID0gZW52T2JqZWN0LmN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrSW5mbyA9IHNjb3BlLmNhbGxiYWNrSW5mbztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLnRoaXogPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uZm4gPSBmO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hcGlWYWx1ZSA9IGVudk9iamVjdC5jYWxsSW50b01vZHVsZShjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCFuYXBpVmFsdWUpID8gdW5kZWZpbmVkIDogZW52T2JqZWN0LmN0eC5oYW5kbGVTdG9yZS5nZXQobmFwaVZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby5kYXRhID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrSW5mby5hcmdzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tJbmZvLnRoaXogPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0luZm8uZm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0LCBzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChmdW5jdGlvbk5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbihlbnZPYmplY3QsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgZjogZiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoL15bXyRhLXpBLVpdW18kYS16QS1aMC05XSokLy50ZXN0KGZ1bmN0aW9uTmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8sIGY6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnROZXdGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgIHZhciBfID0gbWFrZUZ1bmN0aW9uKGVudk9iamVjdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGYgPSAobmV3IEZ1bmN0aW9uKCdfJywgJ3JldHVybiBmdW5jdGlvbiAnICsgZnVuY3Rpb25OYW1lICsgJygpeycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1widXNlIHN0cmljdFwiOycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybiBfLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICd9OycpKShfKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZiA9IG1ha2VGdW5jdGlvbihlbnZPYmplY3QsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLmNhblNldEZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmID0gbWFrZUZ1bmN0aW9uKGVudk9iamVjdCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5jYW5TZXRGdW5jdGlvbk5hbWUpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCAnbmFtZScsIHsgdmFsdWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovLCBmOiBmIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBvYmosIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChnZXR0ZXIgfHwgc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxvY2FsR2V0dGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbFNldHRlciA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsR2V0dGVyID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCAwLCAwLCBnZXR0ZXIsIGRhdGEpLmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTZXR0ZXIgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIDAsIDAsIHNldHRlciwgZGF0YSkuZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogKGF0dHJpYnV0ZXMgJiA0IC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2NvbmZpZ3VyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IChhdHRyaWJ1dGVzICYgMiAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9lbnVtZXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBsb2NhbEdldHRlcixcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBsb2NhbFNldHRlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCBkZXNjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHZhciBsb2NhbE1ldGhvZCA9IGVtbmFwaUNyZWF0ZUZ1bmN0aW9uKGVudk9iamVjdCwgMCwgMCwgbWV0aG9kLCBkYXRhKS5mO1xuICAgICAgICAgICAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IChhdHRyaWJ1dGVzICYgNCAvKiBuYXBpX3Byb3BlcnR5X2F0dHJpYnV0ZXMubmFwaV9jb25maWd1cmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAoYXR0cmlidXRlcyAmIDIgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfZW51bWVyYWJsZSAqLykgIT09IDAsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAoYXR0cmlidXRlcyAmIDEgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfd3JpdGFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbG9jYWxNZXRob2RcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3BlcnR5TmFtZSwgZGVzYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAoYXR0cmlidXRlcyAmIDQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfY29uZmlndXJhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogKGF0dHJpYnV0ZXMgJiAyIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX2VudW1lcmFibGUgKi8pICE9PSAwLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogKGF0dHJpYnV0ZXMgJiAxIC8qIG5hcGlfcHJvcGVydHlfYXR0cmlidXRlcy5uYXBpX3dyaXRhYmxlICovKSAhPT0gMCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpLnZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wZXJ0eU5hbWUsIGRlc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaUdldEhhbmRsZShqc19vYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoIShoYW5kbGUuaXNPYmplY3QoKSB8fCBoYW5kbGUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVtbmFwaUV4dGVybmFsTWVtb3J5ICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoaGFuZGxlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhoYW5kbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmdldChoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLywgaGFuZGxlOiBoYW5kbGUgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQ7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydFdlYWtSZWZFcnJvcignbmFwaV93cmFwJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfd3JhcCcsICdQYXJhbWV0ZXIgXCJyZXN1bHRcIiBtdXN0IGJlIDAoTlVMTCknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWpzX29iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlUmVzdWx0ID0gZW1uYXBpR2V0SGFuZGxlKGpzX29iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZVJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihoYW5kbGVSZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGhhbmRsZVJlc3VsdC5oYW5kbGU7XG4gICAgICAgICAgICAgICAgaWYgKGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKGhhbmRsZS52YWx1ZSkud3JhcHBlZCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5hbGl6ZV9jYilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2VXaXRoRmluYWxpemVyKGVudk9iamVjdCwgaGFuZGxlLmlkLCAwLCAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgcmVmZXJlbmNlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBlbW5hcGlDdHguY3JlYXRlUmVmZXJlbmNlV2l0aEZpbmFsaXplcihlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2VXaXRoRGF0YShlbnZPYmplY3QsIGhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIG5hdGl2ZV9vYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudk9iamVjdC5nZXRPYmplY3RCaW5kaW5nKGhhbmRsZS52YWx1ZSkud3JhcHBlZCA9IHJlZmVyZW5jZS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaVVud3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0LCBhY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBkYXRhO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFqc19vYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGpzX29iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuaXNPYmplY3QoKSB8fCB2YWx1ZS5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VJZCA9IGJpbmRpbmcud3JhcHBlZDtcbiAgICAgICAgICAgICAgICB2YXIgcmVmID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWZlcmVuY2VJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZWYuZGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIGRhdGEsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSAxIC8qIFVud3JhcEFjdGlvbi5SZW1vdmVXcmFwICovKSB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcud3JhcHBlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYub3duZXJzaGlwKCkgPT09IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgd3JhcCBpcyBiZWVuIHJlbW92ZWQsIHRoZSBmaW5hbGl6ZXIgc2hvdWxkIGJlIHJlc2V0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmLnJlc2V0RmluYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWYuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVmaW5lX2NsYXNzKGVudiwgdXRmOG5hbWUsIGxlbmd0aCwgY29uc3RydWN0b3IsIGNhbGxiYWNrX2RhdGEsIHByb3BlcnR5X2NvdW50LCBwcm9wZXJ0aWVzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwcm9wUHRyLCB2YWx1ZUhhbmRsZUlkLCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eV9jb3VudCA9IHByb3BlcnR5X2NvdW50ID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9jb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZW5ndGggPCAtMSkgfHwgKGxlbmd0aCA+IDIxNDc0ODM2NDcpIHx8ICghdXRmOG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBmcmVzdWx0ID0gZW1uYXBpQ3JlYXRlRnVuY3Rpb24oZW52T2JqZWN0LCB1dGY4bmFtZSwgbGVuZ3RoLCBjb25zdHJ1Y3RvciwgY2FsbGJhY2tfZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyZXN1bHQuc3RhdHVzICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGZyZXN1bHQuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICB2YXIgRiA9IGZyZXN1bHQuZjtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eV9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgcHJvcFB0ciA9IHByb3BlcnRpZXMgKyAoaSAqICg0ICogOCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdXRmOE5hbWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWVfMSA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyA4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdldHRlciA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAxMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTYsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjAsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMjgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRmOE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcodXRmOE5hbWUsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChuYW1lXzEpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwcm9wZXJ0eU5hbWUgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcyAmIDEwMjQgLyogbmFwaV9wcm9wZXJ0eV9hdHRyaWJ1dGVzLm5hcGlfc3RhdGljICovKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRGVmaW5lUHJvcGVydHkoZW52T2JqZWN0LCBGLCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaURlZmluZVByb3BlcnR5KGVudk9iamVjdCwgRi5wcm90b3R5cGUsIHByb3BlcnR5TmFtZSwgbWV0aG9kLCBnZXR0ZXIsIHNldHRlciwgdmFsdWUsIGF0dHJpYnV0ZXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlSGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKEYpO1xuICAgICAgICAgICAgICAgIHZhbHVlSGFuZGxlSWQgPSB2YWx1ZUhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlSGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3dyYXAoZW52LCBqc19vYmplY3QsIG5hdGl2ZV9vYmplY3QsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlXcmFwKGVudiwganNfb2JqZWN0LCBuYXRpdmVfb2JqZWN0LCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlVbndyYXAoZW52LCBqc19vYmplY3QsIHJlc3VsdCwgMCAvKiBVbndyYXBBY3Rpb24uS2VlcFdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZW1vdmVfd3JhcChlbnYsIGpzX29iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZW1uYXBpVW53cmFwKGVudiwganNfb2JqZWN0LCByZXN1bHQsIDEgLyogVW53cmFwQWN0aW9uLlJlbW92ZVdyYXAgKi8pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlX3RhZ19vYmplY3QoZW52LCBvYmplY3QsIHR5cGVfdGFnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmICghKHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdHlwZV90YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRhZyA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgICAgICB0YWcuc2V0KG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCB0eXBlX3RhZywgMTYpKTtcbiAgICAgICAgICAgICAgICBiaW5kaW5nLnRhZyA9IG5ldyBVaW50MzJBcnJheSh0YWcuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2hlY2tfb2JqZWN0X3R5cGVfdGFnKGVudiwgb2JqZWN0LCB0eXBlX3RhZywgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBvbmUtdmFyXG4gICAgICAgICAgICB2YXIgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuaXNPYmplY3QoKSB8fCB2YWx1ZS5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8gOiAyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0eXBlX3RhZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QudHJ5Q2F0Y2guaGFzQ2F1Z2h0KCkgPyAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovIDogMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpID8gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyA6IDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nID0gZW52T2JqZWN0LmdldE9iamVjdEJpbmRpbmcodmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nLnRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFnID0gYmluZGluZy50YWc7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlVGFnID0gbmV3IFVpbnQzMkFycmF5KHdhc21NZW1vcnkuYnVmZmVyLCB0eXBlX3RhZywgNCk7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9ICh0YWdbMF0gPT09IHR5cGVUYWdbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1sxXSA9PT0gdHlwZVRhZ1sxXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnWzJdID09PSB0eXBlVGFnWzJdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdbM10gPT09IHR5cGVUYWdbM10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHJldCA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9hZGRfZmluYWxpemVyKGVudiwganNfb2JqZWN0LCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghanNfb2JqZWN0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWZpbmFsaXplX2NiKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlUmVzdWx0ID0gZW1uYXBpR2V0SGFuZGxlKGpzX29iamVjdCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlUmVzdWx0LnN0YXR1cyAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoaGFuZGxlUmVzdWx0LnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gaGFuZGxlUmVzdWx0LmhhbmRsZTtcbiAgICAgICAgICAgIHZhciBvd25lcnNoaXAgPSAhcmVzdWx0ID8gMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8gOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi87XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIoZW52T2JqZWN0LCBoYW5kbGUuaWQsIDAsIG93bmVyc2hpcCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgcmVmZXJlbmNlSWQgPSByZWZlcmVuY2UuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHJlZmVyZW5jZUlkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9wb3N0X2ZpbmFsaXplcihlbnYsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5lbnF1ZXVlRmluYWxpemVyKGVtbmFwaUN0eC5jcmVhdGVUcmFja2VkRmluYWxpemVyKGVudk9iamVjdCwgZmluYWxpemVfY2IsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd3JhcE1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2FkZF9maW5hbGl6ZXI6IG5hcGlfYWRkX2ZpbmFsaXplcixcbiAgICAgICAgICAgIG5hcGlfY2hlY2tfb2JqZWN0X3R5cGVfdGFnOiBuYXBpX2NoZWNrX29iamVjdF90eXBlX3RhZyxcbiAgICAgICAgICAgIG5hcGlfZGVmaW5lX2NsYXNzOiBuYXBpX2RlZmluZV9jbGFzcyxcbiAgICAgICAgICAgIG5hcGlfcmVtb3ZlX3dyYXA6IG5hcGlfcmVtb3ZlX3dyYXAsXG4gICAgICAgICAgICBuYXBpX3R5cGVfdGFnX29iamVjdDogbmFwaV90eXBlX3RhZ19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX3Vud3JhcDogbmFwaV91bndyYXAsXG4gICAgICAgICAgICBuYXBpX3dyYXA6IG5hcGlfd3JhcCxcbiAgICAgICAgICAgIG5vZGVfYXBpX3Bvc3RfZmluYWxpemVyOiBub2RlX2FwaV9wb3N0X2ZpbmFsaXplclxuICAgICAgICB9KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2NyZWF0ZV9tZW1vcnlfdmlldyhlbnYsIHR5cGVkYXJyYXlfdHlwZSwgZXh0ZXJuYWxfZGF0YSwgYnl0ZV9sZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQ2Fubm90IGNyZWF0ZSBhIG1lbW9yeSB2aWV3IGxhcmdlciB0aGFuIDIxNDc0ODM2NDcgYnl0ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ2VtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcnLCAnUGFyYW1ldGVyIFwiZmluYWxpemVfY2JcIiBtdXN0IGJlIDAoTlVMTCknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZpZXdEZXNjcmlwdG9yID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZWRhcnJheV90eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50OF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBJbnQ4QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV91aW50OF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50OEFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDhfY2xhbXBlZF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50OENsYW1wZWRBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCwgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2ludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEludDE2QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMSwgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX3VpbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBVaW50MTZBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAxLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfaW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogSW50MzJBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAyLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfdWludDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IFVpbnQzMkFycmF5LCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoID4+IDIsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3IC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9mbG9hdDMyX2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEZsb2F0MzJBcnJheSwgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSwgbGVuZ3RoOiBieXRlX2xlbmd0aCA+PiAyLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgOCAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfZmxvYXQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdEZXNjcmlwdG9yID0geyBDdG9yOiBGbG9hdDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDkgLyogZW1uYXBpX21lbW9yeV92aWV3X3R5cGUuZW1uYXBpX2JpZ2ludDY0X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0Rlc2NyaXB0b3IgPSB7IEN0b3I6IEJpZ0ludDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9iaWd1aW50NjRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogQmlnVWludDY0QXJyYXksIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGggPj4gMywgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sIHJ1bnRpbWVBbGxvY2F0ZWQ6IDAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIC0xIC8qIGVtbmFwaV9tZW1vcnlfdmlld190eXBlLmVtbmFwaV9kYXRhX3ZpZXcgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogRGF0YVZpZXcsIGFkZHJlc3M6IGV4dGVybmFsX2RhdGEsIGxlbmd0aDogYnl0ZV9sZW5ndGgsIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLCBydW50aW1lQWxsb2NhdGVkOiAwIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ2VtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3RGVzY3JpcHRvciA9IHsgQ3RvcjogZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyLCBhZGRyZXNzOiBleHRlcm5hbF9kYXRhLCBsZW5ndGg6IGJ5dGVfbGVuZ3RoLCBvd25lcnNoaXA6IDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLywgcnVudGltZUFsbG9jYXRlZDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEN0b3IgPSB2aWV3RGVzY3JpcHRvci5DdG9yO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlZEFycmF5ID0gdHlwZWRhcnJheV90eXBlID09PSAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovXG4gICAgICAgICAgICAgICAgICAgID8gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIHZpZXdEZXNjcmlwdG9yLmFkZHJlc3MsIHZpZXdEZXNjcmlwdG9yLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgQ3Rvcih3YXNtTWVtb3J5LmJ1ZmZlciwgdmlld0Rlc2NyaXB0b3IuYWRkcmVzcywgdmlld0Rlc2NyaXB0b3IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHR5cGVkQXJyYXkpO1xuICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuc2V0KHR5cGVkQXJyYXksIHZpZXdEZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1c18xID0gbmFwaV9hZGRfZmluYWxpemVyKGVudiwgaGFuZGxlLmlkLCBleHRlcm5hbF9kYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgLyogTlVMTCAqLyAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c18xID09PSAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gZW52T2JqZWN0LnRyeUNhdGNoLmV4dHJhY3RFeGNlcHRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1c18xICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKHN0YXR1c18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgPyAxIDogMDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9pc19zdXBwb3J0X2JpZ2ludCgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0QmlnSW50ID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBlbW5hcGlfaXNfbm9kZV9iaW5kaW5nX2F2YWlsYWJsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlOb2RlQmluZGluZyA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlTeW5jTWVtb3J5KGpzX3RvX3dhc20sIGFycmF5QnVmZmVyT3JWaWV3LCBvZmZzZXQsIGxlbikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICE9PSBudWxsICYmIG9mZnNldCAhPT0gdm9pZCAwID8gb2Zmc2V0IDogMDtcbiAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgIHZhciB2aWV3O1xuICAgICAgICAgICAgaWYgKGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gQXJyYXlCdWZmZXIgYWRkcmVzcycpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGVuICE9PSAnbnVtYmVyJyB8fCBsZW4gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbiA9IGFycmF5QnVmZmVyT3JWaWV3LmJ5dGVMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbiA9IGxlbiA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlCdWZmZXJPclZpZXc7XG4gICAgICAgICAgICAgICAgdmlldyA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyT3JWaWV3LCBvZmZzZXQsIGxlbik7XG4gICAgICAgICAgICAgICAgdmFyIHdhc21NZW1vcnlVOCA9IG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpzX3RvX3dhc20pIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldy5zZXQod2FzbU1lbW9yeVU4LnN1YmFycmF5KHBvaW50ZXIsIHBvaW50ZXIgKyBsZW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdhc21NZW1vcnlVOC5zZXQodmlldywgcG9pbnRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUJ1ZmZlck9yVmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYXlCdWZmZXJPclZpZXcpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHZpZXdQb2ludGVySW5mbyA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldFZpZXdQb2ludGVyKGFycmF5QnVmZmVyT3JWaWV3LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgdmFyIGxhdGVzdFZpZXcgPSB2aWV3UG9pbnRlckluZm8udmlldztcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnRlciA9IHZpZXdQb2ludGVySW5mby5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIGlmICghcG9pbnRlcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIEFycmF5QnVmZmVyIGFkZHJlc3MnKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxlbiAhPT0gJ251bWJlcicgfHwgbGVuID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZW4gPSBsYXRlc3RWaWV3LmJ5dGVMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbiA9IGxlbiA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGF0ZXN0VmlldztcbiAgICAgICAgICAgICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkobGF0ZXN0Vmlldy5idWZmZXIsIGxhdGVzdFZpZXcuYnl0ZU9mZnNldCArIG9mZnNldCwgbGVuKTtcbiAgICAgICAgICAgICAgICB2YXIgd2FzbU1lbW9yeVU4ID0gbmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghanNfdG9fd2FzbSkge1xuICAgICAgICAgICAgICAgICAgICB2aWV3LnNldCh3YXNtTWVtb3J5VTguc3ViYXJyYXkocG9pbnRlciwgcG9pbnRlciArIGxlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2FzbU1lbW9yeVU4LnNldCh2aWV3LCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhdGVzdFZpZXc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbW5hcGlTeW5jTWVtb3J5IGV4cGVjdCBBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXcgYXMgZmlyc3QgcGFyYW1ldGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9zeW5jX21lbW9yeShlbnYsIGpzX3RvX3dhc20sIGFycmF5YnVmZmVyX29yX3ZpZXcsIG9mZnNldCwgbGVuKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGVJZCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChoYW5kbGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGUuaXNBcnJheUJ1ZmZlcigpICYmICFoYW5kbGUuaXNUeXBlZEFycmF5KCkgJiYgIWhhbmRsZS5pc0RhdGFWaWV3KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9ICRlbW5hcGlTeW5jTWVtb3J5KEJvb2xlYW4oanNfdG9fd2FzbSksIGhhbmRsZS52YWx1ZSwgb2Zmc2V0LCBsZW4pO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgIT09IHJldCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGFycmF5YnVmZmVyX29yX3ZpZXcsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzKGFycmF5QnVmZmVyT3JWaWV3KSB7XG4gICAgICAgICAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG4gICAgICAgICAgICB2YXIgaXNEYXRhVmlldyA9IGFycmF5QnVmZmVyT3JWaWV3IGluc3RhbmNlb2YgRGF0YVZpZXc7XG4gICAgICAgICAgICB2YXIgaXNUeXBlZEFycmF5ID0gQXJyYXlCdWZmZXIuaXNWaWV3KGFycmF5QnVmZmVyT3JWaWV3KSAmJiAhaXNEYXRhVmlldztcbiAgICAgICAgICAgIGlmICghaXNBcnJheUJ1ZmZlciAmJiAhaXNUeXBlZEFycmF5ICYmICFpc0RhdGFWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyBleHBlY3QgQXJyYXlCdWZmZXIgb3IgQXJyYXlCdWZmZXJWaWV3IGFzIGZpcnN0IHBhcmFtZXRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGluZm87XG4gICAgICAgICAgICBpZiAoaXNBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRBcnJheUJ1ZmZlclBvaW50ZXIoYXJyYXlCdWZmZXJPclZpZXcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZm8gPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5nZXRWaWV3UG9pbnRlcihhcnJheUJ1ZmZlck9yVmlldywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBpbmZvLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgb3duZXJzaGlwOiBpbmZvLm93bmVyc2hpcCxcbiAgICAgICAgICAgICAgICBydW50aW1lQWxsb2NhdGVkOiBpbmZvLnJ1bnRpbWVBbGxvY2F0ZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZW1uYXBpX2dldF9tZW1vcnlfYWRkcmVzcyhlbnYsIGFycmF5YnVmZmVyX29yX3ZpZXcsIGFkZHJlc3MsIG93bmVyc2hpcCwgcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwLCBydW50aW1lQWxsb2NhdGVkLCBvd25lcnNoaXBPdXQ7XG4gICAgICAgICAgICB2YXIgaW5mbztcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXJfb3JfdmlldylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MgJiYgIW93bmVyc2hpcCAmJiAhcnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyX29yX3ZpZXcpO1xuICAgICAgICAgICAgICAgIGluZm8gPSAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyhoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgIHAgPSBpbmZvLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhZGRyZXNzLCBwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG93bmVyc2hpcCkge1xuICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXBPdXQgPSBpbmZvLm93bmVyc2hpcDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIob3duZXJzaGlwLCBvd25lcnNoaXBPdXQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnVudGltZV9hbGxvY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZCA9IGluZm8ucnVudGltZUFsbG9jYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChydW50aW1lX2FsbG9jYXRlZCwgcnVudGltZUFsbG9jYXRlZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uKGVudiwgdmVyc2lvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIXZlcnNpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBydW50aW1lVmVyc2lvbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcnVudGltZVZlcnNpb24gPSBlbW5hcGlDdHguZ2V0UnVudGltZVZlcnNpb25zKCkudmVyc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmVyc2lvbnMgPSBydW50aW1lVmVyc2lvbi5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobikgeyByZXR1cm4gTnVtYmVyKG4pOyB9KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodmVyc2lvbiwgdmVyc2lvbnNbMF0sIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHZlcnNpb24gKyA0LCB2ZXJzaW9uc1sxXSwgdHJ1ZSk7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIodmVyc2lvbiArIDgsIHZlcnNpb25zWzJdLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgICRlbW5hcGlHZXRNZW1vcnlBZGRyZXNzOiAkZW1uYXBpR2V0TWVtb3J5QWRkcmVzcyxcbiAgICAgICAgICAgICRlbW5hcGlTeW5jTWVtb3J5OiAkZW1uYXBpU3luY01lbW9yeSxcbiAgICAgICAgICAgIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXc6IGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcsXG4gICAgICAgICAgICBlbW5hcGlfZ2V0X21lbW9yeV9hZGRyZXNzOiBlbW5hcGlfZ2V0X21lbW9yeV9hZGRyZXNzLFxuICAgICAgICAgICAgZW1uYXBpX2dldF9ydW50aW1lX3ZlcnNpb246IGVtbmFwaV9nZXRfcnVudGltZV92ZXJzaW9uLFxuICAgICAgICAgICAgZW1uYXBpX2lzX25vZGVfYmluZGluZ19hdmFpbGFibGU6IGVtbmFwaV9pc19ub2RlX2JpbmRpbmdfYXZhaWxhYmxlLFxuICAgICAgICAgICAgZW1uYXBpX2lzX3N1cHBvcnRfYmlnaW50OiBlbW5hcGlfaXNfc3VwcG9ydF9iaWdpbnQsXG4gICAgICAgICAgICBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmOiBlbW5hcGlfaXNfc3VwcG9ydF93ZWFrcmVmLFxuICAgICAgICAgICAgZW1uYXBpX3N5bmNfbWVtb3J5OiBlbW5hcGlfc3luY19tZW1vcnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShbXSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9hcnJheV93aXRoX2xlbmd0aChlbnYsIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG5ldyBBcnJheShsZW5ndGgpKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCwgZGF0YSkge1xuICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCA+Pj4gMDtcbiAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgcCA9IGVtbmFwaUV4dGVybmFsTWVtb3J5LmdldEFycmF5QnVmZmVyUG9pbnRlcihhcnJheUJ1ZmZlciwgdHJ1ZSkuYWRkcmVzcztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKGRhdGEsIHAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2FycmF5YnVmZmVyKGVudiwgYnl0ZV9sZW5ndGgsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGFycmF5QnVmZmVyID0gZW1uYXBpQ3JlYXRlQXJyYXlCdWZmZXIoYnl0ZV9sZW5ndGgsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKGFycmF5QnVmZmVyKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcGRwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRlKGVudiwgdGltZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUobmV3IERhdGUodGltZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXh0ZXJuYWwoZW52LCBkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBleHRlcm5hbEhhbmRsZSA9IGVtbmFwaUN0eC5nZXRDdXJyZW50U2NvcGUoKS5hZGRFeHRlcm5hbChkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1uYXBpQ3R4LmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIoZW52T2JqZWN0LCBleHRlcm5hbEhhbmRsZS5pZCwgMCwgMCAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWUgKi8sIGZpbmFsaXplX2NiLCBkYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBleHRlcm5hbEhhbmRsZS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyKGVudiwgZXh0ZXJuYWxfZGF0YSwgYnl0ZV9sZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFleHRlcm5hbF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChleHRlcm5hbF9kYXRhICsgYnl0ZV9sZW5ndGgpID4gd2FzbU1lbW9yeS5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTWVtb3J5IG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRGaW5hbGl6ZXIgJiYgZmluYWxpemVfY2IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IoJ25hcGlfY3JlYXRlX2V4dGVybmFsX2FycmF5YnVmZmVyJywgJ1BhcmFtZXRlciBcImZpbmFsaXplX2NiXCIgbXVzdCBiZSAwKE5VTEwpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVfbGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZUNoYW5uZWxfMSA9IGVtbmFwaUN0eC5mZWF0dXJlLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2VDaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsXzEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKGFycmF5QnVmZmVyLCBbYXJyYXlCdWZmZXJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdThhcnIgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHU4YXJyLnNldChuZXcgVWludDhBcnJheSh3YXNtTWVtb3J5LmJ1ZmZlcikuc3ViYXJyYXkoZXh0ZXJuYWxfZGF0YSwgZXh0ZXJuYWxfZGF0YSArIGJ5dGVfbGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGVtbmFwaUV4dGVybmFsTWVtb3J5LnRhYmxlLnNldChhcnJheUJ1ZmZlciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogZXh0ZXJuYWxfZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsaXplX2NiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXNfMSA9IG5hcGlfYWRkX2ZpbmFsaXplcihlbnYsIGhhbmRsZS5pZCwgZXh0ZXJuYWxfZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIC8qIE5VTEwgKi8gMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfMSA9PT0gMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0dXNfMSAhPT0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihzdGF0dXNfMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBoYW5kbGUuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9vYmplY3QoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoe30pLmlkO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfc3ltYm9sKGVudiwgZGVzY3JpcHRpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN5bWJvbC1kZXNjcmlwdGlvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKFN5bWJvbCgpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVzYyA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2MgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoU3ltYm9sKGRlc2MpKS5pZDtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBpcHBwcFxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfdHlwZWRhcnJheShlbnYsIHR5cGUsIGxlbmd0aCwgYXJyYXlidWZmZXIsIGJ5dGVfb2Zmc2V0LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVUeXBlZEFycmF5ID0gZnVuY3Rpb24gKGVudk9iamVjdCwgVHlwZSwgc2l6ZV9vZl9lbGVtZW50LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBieXRlX29mZnNldCA9IGJ5dGVfb2Zmc2V0ID4+PiAwO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplX29mX2VsZW1lbnQgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfb2Zmc2V0KSAlIChzaXplX29mX2VsZW1lbnQpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKFwic3RhcnQgb2Zmc2V0IG9mIFwiLmNvbmNhdCgoX2EgPSBUeXBlLm5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnLCBcIiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBcIikuY29uY2F0KHNpemVfb2ZfZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfVFlQRURBUlJBWV9BTElHTk1FTlQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgoKGxlbmd0aCAqIHNpemVfb2ZfZWxlbWVudCkgKyBieXRlX29mZnNldCkgPiBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnRVJSX05BUElfSU5WQUxJRF9UWVBFREFSUkFZX0xFTkdUSCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDkgLyogbmFwaV9zdGF0dXMubmFwaV9nZW5lcmljX2ZhaWx1cmUgKi8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBvdXQgPSBuZXcgVHlwZShidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLmhhcyhvdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQob3V0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0b3I6IFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGJ5dGVfb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG91dCkuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2ludDhfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDhBcnJheSwgMSwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDhfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQ4QXJyYXksIDEsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQ4X2NsYW1wZWRfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIFVpbnQ4Q2xhbXBlZEFycmF5LCAxLCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9pbnQxNl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgSW50MTZBcnJheSwgMiwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfdWludDE2X2FycmF5ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVkQXJyYXkoZW52T2JqZWN0LCBVaW50MTZBcnJheSwgMiwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfaW50MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEludDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNiAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX3VpbnQzMl9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgVWludDMyQXJyYXksIDQsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNyAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2Zsb2F0MzJfYXJyYXkgKi86XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVHlwZWRBcnJheShlbnZPYmplY3QsIEZsb2F0MzJBcnJheSwgNCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA4IC8qIG5hcGlfdHlwZWRhcnJheV90eXBlLm5hcGlfZmxvYXQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgRmxvYXQ2NEFycmF5LCA4LCBidWZmZXIsIGJ5dGVfb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDkgLyogbmFwaV90eXBlZGFycmF5X3R5cGUubmFwaV9iaWdpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgQmlnSW50NjRBcnJheSwgOCwgYnVmZmVyLCBieXRlX29mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMCAvKiBuYXBpX3R5cGVkYXJyYXlfdHlwZS5uYXBpX2JpZ3VpbnQ2NF9hcnJheSAqLzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUeXBlZEFycmF5KGVudk9iamVjdCwgQmlnVWludDY0QXJyYXksIDgsIGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fZGVwcyBtYWxsb2NcbiAgICAgICAgICogQF9fc2lnIGlwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2J1ZmZlcihlbnYsIHNpemUsIGRhdGEsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlLCBwb2ludGVyO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIEJ1ZmZlciA9IGVtbmFwaUN0eC5mZWF0dXJlLkJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAoIUJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlbW5hcGlDdHguY3JlYXRlTm90U3VwcG9ydEJ1ZmZlckVycm9yKCduYXBpX2NyZWF0ZV9idWZmZXInLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWZmZXIgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgKHNpemUgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYnVmZmVyKS5pZDtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gX21hbGxvYyhzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwb2ludGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdXQgb2YgbWVtb3J5Jyk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KHdhc21NZW1vcnkuYnVmZmVyKS5zdWJhcnJheShwb2ludGVyLCBwb2ludGVyICsgc2l6ZSkuZmlsbCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ1ZmZlcl8xID0gQnVmZmVyLmZyb20od2FzbU1lbW9yeS5idWZmZXIsIHBvaW50ZXIsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlld0Rlc2NyaXB0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBwb2ludGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBzaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSA/IDAgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtSdW50aW1lICovIDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS53YXNtTWVtb3J5Vmlld1RhYmxlLnNldChidWZmZXJfMSwgdmlld0Rlc2NyaXB0b3IpO1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSBlbW5hcGlFeHRlcm5hbE1lbW9yeS5yZWdpc3RyeSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlZ2lzdGVyKHZpZXdEZXNjcmlwdG9yLCBwb2ludGVyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoYnVmZmVyXzEpLmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgcG9pbnRlciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBfX3NpZyBpcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5KGVudiwgbGVuZ3RoLCBkYXRhLCByZXN1bHRfZGF0YSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQnVmZmVyID0gZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyO1xuICAgICAgICAgICAgICAgIGlmICghQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVtbmFwaUN0eC5jcmVhdGVOb3RTdXBwb3J0QnVmZmVyRXJyb3IoJ25hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5JywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJyYXlCdWZmZXIgPSBlbW5hcGlDcmVhdGVBcnJheUJ1ZmZlcihsZW5ndGgsIHJlc3VsdF9kYXRhKTtcbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5zZXQobmV3IFVpbnQ4QXJyYXkod2FzbU1lbW9yeS5idWZmZXIpLnN1YmFycmF5KGRhdGEsIGRhdGEgKyBsZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShidWZmZXIpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQF9fc2lnIGlwcHBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcihlbnYsIGxlbmd0aCwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQsIHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtbmFwaV9jcmVhdGVfbWVtb3J5X3ZpZXcoZW52LCAtMiAvKiBlbW5hcGlfbWVtb3J5X3ZpZXdfdHlwZS5lbW5hcGlfYnVmZmVyICovLCBkYXRhLCBsZW5ndGgsIGZpbmFsaXplX2NiLCBmaW5hbGl6ZV9oaW50LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfYnVmZmVyX2Zyb21fYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuZ3RoLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSBieXRlX29mZnNldCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFycmF5YnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZS5pc0FycmF5QnVmZmVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IGhhbmRsZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoKGJ5dGVfbGVuZ3RoICsgYnl0ZV9vZmZzZXQpID4gYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBSYW5nZUVycm9yKCdUaGUgYnl0ZSBvZmZzZXQgKyBsZW5ndGggaXMgb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9PVVRfT0ZfUkFOR0UnO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBCdWZmZXIgPSBlbW5hcGlDdHguZmVhdHVyZS5CdWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZW1uYXBpQ3R4LmNyZWF0ZU5vdFN1cHBvcnRCdWZmZXJFcnJvcignbm9kZV9hcGlfY3JlYXRlX2J1ZmZlcl9mcm9tX2FycmF5YnVmZmVyJywgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb3V0ID0gQnVmZmVyLmZyb20oYnVmZmVyLCBieXRlX29mZnNldCwgYnl0ZV9sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXIgPT09IHdhc21NZW1vcnkuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5oYXMob3V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQob3V0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RvcjogQnVmZmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGJ5dGVfb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogYnl0ZV9sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJzaGlwOiAxIC8qIFJlZmVyZW5jZU93bmVyc2hpcC5rVXNlcmxhbmQgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUFsbG9jYXRlZDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKG91dCkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBwXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9kYXRhdmlldyhlbnYsIGJ5dGVfbGVuZ3RoLCBhcnJheWJ1ZmZlciwgYnl0ZV9vZmZzZXQsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhcnJheWJ1ZmZlcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBieXRlX2xlbmd0aCA9IGJ5dGVfbGVuZ3RoID4+PiAwO1xuICAgICAgICAgICAgICAgIGJ5dGVfb2Zmc2V0ID0gYnl0ZV9vZmZzZXQgPj4+IDA7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlLmlzQXJyYXlCdWZmZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVmZmVyID0gaGFuZGxlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICgoYnl0ZV9sZW5ndGggKyBieXRlX29mZnNldCkgPiBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gbmV3IFJhbmdlRXJyb3IoJ2J5dGVfb2Zmc2V0ICsgYnl0ZV9sZW5ndGggc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYXJyYXkgcGFzc2VkIGluJyk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VSUl9OQVBJX0lOVkFMSURfREFUQVZJRVdfQVJHUyc7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGRhdGF2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyID09PSB3YXNtTWVtb3J5LmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVtbmFwaUV4dGVybmFsTWVtb3J5Lndhc21NZW1vcnlWaWV3VGFibGUuaGFzKGRhdGF2aWV3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW1uYXBpRXh0ZXJuYWxNZW1vcnkud2FzbU1lbW9yeVZpZXdUYWJsZS5zZXQoZGF0YXZpZXcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdG9yOiBEYXRhVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBieXRlX29mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGJ5dGVfbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyc2hpcDogMSAvKiBSZWZlcmVuY2VPd25lcnNoaXAua1VzZXJsYW5kICovLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVBbGxvY2F0ZWQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShkYXRhdmlldykuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAX19zaWcgaXBwcHBcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3N5bWJvbF9mb3IoZW52LCB1dGY4ZGVzY3JpcHRpb24sIGxlbmd0aCwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGF1dG9MZW5ndGggPSBsZW5ndGggPT09IC0xO1xuICAgICAgICAgICAgdmFyIHNpemVsZW5ndGggPSBsZW5ndGggPj4+IDA7XG4gICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGY4ZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShhdXRvTGVuZ3RoIHx8IChzaXplbGVuZ3RoIDw9IDIxNDc0ODM2NDcpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRpb25TdHJpbmcgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhkZXNjcmlwdGlvbiwgbGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTeW1ib2wuZm9yKGRlc2NyaXB0aW9uU3RyaW5nKSkuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNyZWF0ZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheTogbmFwaV9jcmVhdGVfYXJyYXksXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheV93aXRoX2xlbmd0aDogbmFwaV9jcmVhdGVfYXJyYXlfd2l0aF9sZW5ndGgsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9hcnJheWJ1ZmZlcjogbmFwaV9jcmVhdGVfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9idWZmZXI6IG5hcGlfY3JlYXRlX2J1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2J1ZmZlcl9jb3B5OiBuYXBpX2NyZWF0ZV9idWZmZXJfY29weSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RhdGF2aWV3OiBuYXBpX2NyZWF0ZV9kYXRhdmlldyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2RhdGU6IG5hcGlfY3JlYXRlX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbDogbmFwaV9jcmVhdGVfZXh0ZXJuYWwsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbF9hcnJheWJ1ZmZlcjogbmFwaV9jcmVhdGVfZXh0ZXJuYWxfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV9leHRlcm5hbF9idWZmZXI6IG5hcGlfY3JlYXRlX2V4dGVybmFsX2J1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX29iamVjdDogbmFwaV9jcmVhdGVfb2JqZWN0LFxuICAgICAgICAgICAgbmFwaV9jcmVhdGVfc3ltYm9sOiBuYXBpX2NyZWF0ZV9zeW1ib2wsXG4gICAgICAgICAgICBuYXBpX2NyZWF0ZV90eXBlZGFycmF5OiBuYXBpX2NyZWF0ZV90eXBlZGFycmF5LFxuICAgICAgICAgICAgbm9kZV9hcGlfY3JlYXRlX2J1ZmZlcl9mcm9tX2FycmF5YnVmZmVyOiBub2RlX2FwaV9jcmVhdGVfYnVmZmVyX2Zyb21fYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBub2RlX2FwaV9zeW1ib2xfZm9yOiBub2RlX2FwaV9zeW1ib2xfZm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYm9vbGVhbihlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdiA9IHZhbHVlID09PSAwID8gMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8gOiA0IC8qIEdsb2JhbEhhbmRsZS5UUlVFICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfZ2xvYmFsKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gNSAvKiBHbG9iYWxIYW5kbGUuR0xPQkFMICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X251bGwoZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAyIC8qIEdsb2JhbEhhbmRsZS5OVUxMICovO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3VuZGVmaW5lZChlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IDEgLyogR2xvYmFsSGFuZGxlLlVOREVGSU5FRCAqLztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2xvYmFsTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2Jvb2xlYW46IG5hcGlfZ2V0X2Jvb2xlYW4sXG4gICAgICAgICAgICBuYXBpX2dldF9nbG9iYWw6IG5hcGlfZ2V0X2dsb2JhbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X251bGw6IG5hcGlfZ2V0X251bGwsXG4gICAgICAgICAgICBuYXBpX2dldF91bmRlZmluZWQ6IG5hcGlfZ2V0X3VuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9pbnN0YW5jZV9kYXRhKGVudiwgZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LnNldEluc3RhbmNlRGF0YShkYXRhLCBmaW5hbGl6ZV9jYiwgZmluYWxpemVfaGludCk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfaW5zdGFuY2VfZGF0YShlbnYsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbnZPYmplY3QuZ2V0SW5zdGFuY2VEYXRhKCk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnZNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9nZXRfaW5zdGFuY2VfZGF0YTogbmFwaV9nZXRfaW5zdGFuY2VfZGF0YSxcbiAgICAgICAgICAgIG5hcGlfc2V0X2luc3RhbmNlX2RhdGE6IG5hcGlfc2V0X2luc3RhbmNlX2RhdGFcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgdnBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gX2VtbmFwaV9nZXRfbGFzdF9lcnJvcl9pbmZvKGVudiwgZXJyb3JfY29kZSwgZW5naW5lX2Vycm9yX2NvZGUsIGVuZ2luZV9yZXNlcnZlZCkge1xuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIHZhciBsYXN0RXJyb3IgPSBlbnZPYmplY3QubGFzdEVycm9yO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGVycm9yQ29kZSA9IGxhc3RFcnJvci5lcnJvckNvZGU7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZW5naW5lRXJyb3JDb2RlID0gbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA+Pj4gMDtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBlbmdpbmVSZXNlcnZlZCA9IGxhc3RFcnJvci5lbmdpbmVSZXNlcnZlZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihlcnJvcl9jb2RlLCBlcnJvckNvZGUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVFcnJvckNvZGUsIHRydWUpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZW5naW5lX3Jlc2VydmVkLCBlbmdpbmVSZXNlcnZlZCwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvdyhlbnYsIGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGVycm9yKS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Rocm93X2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhtc2csIC0xKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNvZGUsIC0xKTtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90aHJvd190eXBlX2Vycm9yKGVudiwgY29kZSwgbXNnKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgVHlwZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfdGhyb3dfcmFuZ2VfZXJyb3IoZW52LCBjb2RlLCBtc2cpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBSYW5nZUVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5vZGVfYXBpX3Rocm93X3N5bnRheF9lcnJvcihlbnYsIGNvZGUsIG1zZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFN5bnRheEVycm9yKGVtbmFwaVN0cmluZy5VVEY4VG9TdHJpbmcobXNnLCAtMSkpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlKVxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyhjb2RlLCAtMSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19leGNlcHRpb25fcGVuZGluZyhlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1zZ1ZhbHVlKTtcbiAgICAgICAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGVWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29kZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2RlVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gY29kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKGVycm9yKS5pZDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3R5cGVfZXJyb3IoZW52LCBjb2RlLCBtc2csIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFtc2cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgbXNnVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG1zZykudmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1zZ1ZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDMgLyogbmFwaV9zdGF0dXMubmFwaV9zdHJpbmdfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IFR5cGVFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9yYW5nZV9lcnJvcihlbnYsIGNvZGUsIG1zZywgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIW1zZylcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBtc2dWYWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobXNnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnVmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgUmFuZ2VFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yKGVudiwgY29kZSwgbXNnLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghbXNnKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIG1zZ1ZhbHVlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChtc2cpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtc2dWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBTeW50YXhFcnJvcihtc2dWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlVmFsdWUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGNvZGUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29kZVZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigzIC8qIG5hcGlfc3RhdHVzLm5hcGlfc3RyaW5nX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IGNvZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShlcnJvcikuaWQ7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYW5kX2NsZWFyX2xhc3RfZXhjZXB0aW9uKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCAxLCB0cnVlKTsgLy8gSURfVU5ERUZJTkVEXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGVyciA9IGVudk9iamVjdC50cnlDYXRjaC5leGNlcHRpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGVycik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2ZhdGFsX2Vycm9yKGxvY2F0aW9uLCBsb2NhdGlvbl9sZW4sIG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKSB7XG4gICAgICAgICAgICB2YXIgbG9jYXRpb25TdHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGxvY2F0aW9uLCBsb2NhdGlvbl9sZW4pO1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2VTdHIgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKTtcbiAgICAgICAgICAgIGlmIChlbW5hcGlOb2RlQmluZGluZykge1xuICAgICAgICAgICAgICAgIGVtbmFwaU5vZGVCaW5kaW5nLm5hcGkuZmF0YWxFcnJvcihsb2NhdGlvblN0ciwgbWVzc2FnZVN0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhYm9ydCgnRkFUQUwgRVJST1I6ICcgKyBsb2NhdGlvblN0ciArICcgJyArIG1lc3NhZ2VTdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZmF0YWxfZXhjZXB0aW9uKGVudiwgZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBlbnZPYmplY3QuY3R4LmhhbmRsZVN0b3JlLmdldChlcnIpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVudk9iamVjdC50cmlnZ2VyRmF0YWxFeGNlcHRpb24oZXJyb3IudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2dldF9sYXN0X2Vycm9yX2luZm86IF9lbW5hcGlfZ2V0X2xhc3RfZXJyb3JfaW5mbyxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Vycm9yOiBuYXBpX2NyZWF0ZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JhbmdlX2Vycm9yOiBuYXBpX2NyZWF0ZV9yYW5nZV9lcnJvcixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3R5cGVfZXJyb3I6IG5hcGlfY3JlYXRlX3R5cGVfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX2ZhdGFsX2Vycm9yOiBuYXBpX2ZhdGFsX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV9mYXRhbF9leGNlcHRpb246IG5hcGlfZmF0YWxfZXhjZXB0aW9uLFxuICAgICAgICAgICAgbmFwaV9nZXRfYW5kX2NsZWFyX2xhc3RfZXhjZXB0aW9uOiBuYXBpX2dldF9hbmRfY2xlYXJfbGFzdF9leGNlcHRpb24sXG4gICAgICAgICAgICBuYXBpX2lzX2V4Y2VwdGlvbl9wZW5kaW5nOiBuYXBpX2lzX2V4Y2VwdGlvbl9wZW5kaW5nLFxuICAgICAgICAgICAgbmFwaV90aHJvdzogbmFwaV90aHJvdyxcbiAgICAgICAgICAgIG5hcGlfdGhyb3dfZXJyb3I6IG5hcGlfdGhyb3dfZXJyb3IsXG4gICAgICAgICAgICBuYXBpX3Rocm93X3JhbmdlX2Vycm9yOiBuYXBpX3Rocm93X3JhbmdlX2Vycm9yLFxuICAgICAgICAgICAgbmFwaV90aHJvd190eXBlX2Vycm9yOiBuYXBpX3Rocm93X3R5cGVfZXJyb3IsXG4gICAgICAgICAgICBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yOiBub2RlX2FwaV9jcmVhdGVfc3ludGF4X2Vycm9yLFxuICAgICAgICAgICAgbm9kZV9hcGlfdGhyb3dfc3ludGF4X2Vycm9yOiBub2RlX2FwaV90aHJvd19zeW50YXhfZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NyZWF0ZV9mdW5jdGlvbihlbnYsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghY2IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGZyZXN1bHQgPSBlbW5hcGlDcmVhdGVGdW5jdGlvbihlbnZPYmplY3QsIHV0ZjhuYW1lLCBsZW5ndGgsIGNiLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJlc3VsdC5zdGF0dXMgIT09IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZnJlc3VsdC5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gZnJlc3VsdC5mO1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZUhhbmRsZSA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShmKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlSGFuZGxlLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfY2JfaW5mbyhlbnYsIGNiaW5mbywgYXJnYywgYXJndiwgdGhpc19hcmcsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBjYmluZm9WYWx1ZSA9IGVtbmFwaUN0eC5zY29wZVN0b3JlLmdldChjYmluZm8pLmNhbGxiYWNrSW5mbztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoYXJndikge1xuICAgICAgICAgICAgICAgIGlmICghYXJnYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnY1ZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0VWludDMyKGFyZ2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIHZhciBsZW4gPSBjYmluZm9WYWx1ZS5hcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgYXJybGVuID0gYXJnY1ZhbHVlIDwgbGVuID8gYXJnY1ZhbHVlIDogbGVuO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFycmxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChjYmluZm9WYWx1ZS5hcmdzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoYXJndiArIGkgKiA0LCBhcmdWYWwsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA8IGFyZ2NWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ2NWYWx1ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihhcmd2ICsgaSAqIDQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ2MpIHtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIoYXJnYywgY2JpbmZvVmFsdWUuYXJncy5sZW5ndGgsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXNfYXJnKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhciB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKGNiaW5mb1ZhbHVlLnRoaXopO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHRoaXNfYXJnLCB2LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIoZGF0YSwgY2JpbmZvVmFsdWUuZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2FsbF9mdW5jdGlvbihlbnYsIHJlY3YsIGZ1bmMsIGFyZ2MsIGFyZ3YsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlY3YpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgYXJnYyA9IGFyZ2MgPj4+IDA7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJndilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2OHJlY3YgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHJlY3YpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghZnVuYylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgdjhmdW5jID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChmdW5jKS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHY4ZnVuYyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ1ZhbCA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKGFyZ3YgKyBpICogNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGFyZ1ZhbCkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdjhmdW5jLmFwcGx5KHY4cmVjdiwgYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX25ld19pbnN0YW5jZShlbnYsIGNvbnN0cnVjdG9yLCBhcmdjLCBhcmd2LCByZXN1bHQpIHtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGFyZ2MgPSBhcmdjID4+PiAwO1xuICAgICAgICAgICAgICAgIGlmIChhcmdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZ3YpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgQ3RvciA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29uc3RydWN0b3IpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ3RvciAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgaWYgKGVtbmFwaUN0eC5mZWF0dXJlLnN1cHBvcnRSZWZsZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdMaXN0ID0gQXJyYXkoYXJnYyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdWYWwgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihhcmd2ICsgaSAqIDQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdFtpXSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJnVmFsKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXQgPSBSZWZsZWN0LmNvbnN0cnVjdChDdG9yLCBhcmdMaXN0LCBDdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkoYXJnYyArIDEpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJnVmFsID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIoYXJndiArIGkgKiA0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaSArIDFdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcmdWYWwpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBCb3VuZEN0b3IgPSBDdG9yLmJpbmQuYXBwbHkoQ3RvciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IG5ldyBCb3VuZEN0b3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gZW52T2JqZWN0LmVuc3VyZUhhbmRsZUlkKHJldCk7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X25ld190YXJnZXQoZW52LCBjYmluZm8sIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFjYmluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgY2JpbmZvVmFsdWUgPSBlbW5hcGlDdHguc2NvcGVTdG9yZS5nZXQoY2JpbmZvKS5jYWxsYmFja0luZm87XG4gICAgICAgICAgICB2YXIgdGhpeiA9IGNiaW5mb1ZhbHVlLnRoaXosIGZuID0gY2JpbmZvVmFsdWUuZm47XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGl6ID09IG51bGwgfHwgdGhpei5jb25zdHJ1Y3RvciA9PSBudWxsXG4gICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgOiB0aGl6IGluc3RhbmNlb2YgZm5cbiAgICAgICAgICAgICAgICAgICAgPyBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodGhpei5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdW5jdGlvbk1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2NhbGxfZnVuY3Rpb246IG5hcGlfY2FsbF9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX2Z1bmN0aW9uOiBuYXBpX2NyZWF0ZV9mdW5jdGlvbixcbiAgICAgICAgICAgIG5hcGlfZ2V0X2NiX2luZm86IG5hcGlfZ2V0X2NiX2luZm8sXG4gICAgICAgICAgICBuYXBpX2dldF9uZXdfdGFyZ2V0OiBuYXBpX2dldF9uZXdfdGFyZ2V0LFxuICAgICAgICAgICAgbmFwaV9uZXdfaW5zdGFuY2U6IG5hcGlfbmV3X2luc3RhbmNlXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5faGFuZGxlX3Njb3BlKGVudiwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHNjb3BlID0gZW1uYXBpQ3R4Lm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgc2NvcGUuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlKGVudiwgc2NvcGUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghc2NvcGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICgoZW52T2JqZWN0Lm9wZW5IYW5kbGVTY29wZXMgPT09IDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDEzIC8qIG5hcGlfc3RhdHVzLm5hcGlfaGFuZGxlX3Njb3BlX21pc21hdGNoICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1uYXBpQ3R4LmNsb3NlU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29wZW5fZXNjYXBhYmxlX2hhbmRsZV9zY29wZShlbnYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBzY29wZSA9IGVtbmFwaUN0eC5vcGVuU2NvcGUoZW52T2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHNjb3BlLmlkLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGUoZW52LCBzY29wZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTMgLyogbmFwaV9zdGF0dXMubmFwaV9oYW5kbGVfc2NvcGVfbWlzbWF0Y2ggKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbW5hcGlDdHguY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9lc2NhcGVfaGFuZGxlKGVudiwgc2NvcGUsIGVzY2FwZWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFzY29wZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFlc2NhcGVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHNjb3BlT2JqZWN0ID0gZW1uYXBpQ3R4LnNjb3BlU3RvcmUuZ2V0KHNjb3BlKTtcbiAgICAgICAgICAgIGlmICghc2NvcGVPYmplY3QuZXNjYXBlQ2FsbGVkKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmV3SGFuZGxlID0gc2NvcGVPYmplY3QuZXNjYXBlKGVzY2FwZWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXdIYW5kbGUgPyBuZXdIYW5kbGUuaWQgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTIgLyogbmFwaV9zdGF0dXMubmFwaV9lc2NhcGVfY2FsbGVkX3R3aWNlICovKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcGlwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfY3JlYXRlX3JlZmVyZW5jZShlbnYsIHZhbHVlLCBpbml0aWFsX3JlZmNvdW50LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPCAxMCkge1xuICAgICAgICAgICAgICAgIGlmICghKGhhbmRsZS5pc09iamVjdCgpIHx8IGhhbmRsZS5pc0Z1bmN0aW9uKCkgfHwgaGFuZGxlLmlzU3ltYm9sKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHJlZiA9IGVtbmFwaUN0eC5jcmVhdGVSZWZlcmVuY2UoZW52T2JqZWN0LCBoYW5kbGUuaWQsIGluaXRpYWxfcmVmY291bnQgPj4+IDAsIDEgLyogUmVmZXJlbmNlT3duZXJzaGlwLmtVc2VybGFuZCAqLyk7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByZWYuaWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGVsZXRlX3JlZmVyZW5jZShlbnYsIHJlZikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIXJlZilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9yZWZlcmVuY2VfcmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBlbW5hcGlDdHgucmVmU3RvcmUuZ2V0KHJlZikucmVmKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBjb3VudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVmZXJlbmNlX3VucmVmKGVudiwgcmVmLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghcmVmKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgdmFyIHJlZmNvdW50ID0gcmVmZXJlbmNlLnJlZmNvdW50KCk7XG4gICAgICAgICAgICBpZiAocmVmY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcig5IC8qIG5hcGlfc3RhdHVzLm5hcGlfZ2VuZXJpY19mYWlsdXJlICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IHJlZmVyZW5jZS51bnJlZigpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0VWludDMyKHJlc3VsdCwgY291bnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9yZWZlcmVuY2VfdmFsdWUoZW52LCByZWYsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFyZWYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgcmVmZXJlbmNlID0gZW1uYXBpQ3R4LnJlZlN0b3JlLmdldChyZWYpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIGhhbmRsZUlkID0gcmVmZXJlbmNlLmdldChlbnZPYmplY3QpO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgaGFuZGxlSWQsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2FkZF9lbnZfY2xlYW51cF9ob29rKGVudiwgZnVuLCBhcmcpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFmdW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGVtbmFwaUN0eC5hZGRDbGVhbnVwSG9vayhlbnZPYmplY3QsIGZ1biwgYXJnKTtcbiAgICAgICAgICAgIHJldHVybiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi87XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVtb3ZlX2Vudl9jbGVhbnVwX2hvb2soZW52LCBmdW4sIGFyZykge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBpZiAoIWZ1bilcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgZW1uYXBpQ3R4LnJlbW92ZUNsZWFudXBIb29rKGVudk9iamVjdCwgZnVuLCBhcmcpO1xuICAgICAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIHZwICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZW52X3JlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QucmVmKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyB2cCAqL1xuICAgICAgICBmdW5jdGlvbiBfZW1uYXBpX2Vudl91bnJlZihlbnYpIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlmZU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBfZW1uYXBpX2Vudl9yZWY6IF9lbW5hcGlfZW52X3JlZixcbiAgICAgICAgICAgIF9lbW5hcGlfZW52X3VucmVmOiBfZW1uYXBpX2Vudl91bnJlZixcbiAgICAgICAgICAgIG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2s6IG5hcGlfYWRkX2Vudl9jbGVhbnVwX2hvb2ssXG4gICAgICAgICAgICBuYXBpX2Nsb3NlX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfY2xvc2VfZXNjYXBhYmxlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY2xvc2VfaGFuZGxlX3Njb3BlOiBuYXBpX2Nsb3NlX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3JlZmVyZW5jZTogbmFwaV9jcmVhdGVfcmVmZXJlbmNlLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfcmVmZXJlbmNlOiBuYXBpX2RlbGV0ZV9yZWZlcmVuY2UsXG4gICAgICAgICAgICBuYXBpX2VzY2FwZV9oYW5kbGU6IG5hcGlfZXNjYXBlX2hhbmRsZSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3JlZmVyZW5jZV92YWx1ZTogbmFwaV9nZXRfcmVmZXJlbmNlX3ZhbHVlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2VzY2FwYWJsZV9oYW5kbGVfc2NvcGU6IG5hcGlfb3Blbl9lc2NhcGFibGVfaGFuZGxlX3Njb3BlLFxuICAgICAgICAgICAgbmFwaV9vcGVuX2hhbmRsZV9zY29wZTogbmFwaV9vcGVuX2hhbmRsZV9zY29wZSxcbiAgICAgICAgICAgIG5hcGlfcmVmZXJlbmNlX3JlZjogbmFwaV9yZWZlcmVuY2VfcmVmLFxuICAgICAgICAgICAgbmFwaV9yZWZlcmVuY2VfdW5yZWY6IG5hcGlfcmVmZXJlbmNlX3VucmVmLFxuICAgICAgICAgICAgbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9vazogbmFwaV9yZW1vdmVfZW52X2NsZWFudXBfaG9va1xuICAgICAgICB9KTtcbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpICovXG4gICAgICAgIGZ1bmN0aW9uIF9lbW5hcGlfZ2V0X2ZpbGVuYW1lKGVudiwgYnVmLCBsZW4pIHtcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBlbnZPYmplY3QuZmlsZW5hbWU7XG4gICAgICAgICAgICBpZiAoIWJ1Zikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcubGVuZ3RoQnl0ZXNVVEY4KGZpbGVuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbW5hcGlTdHJpbmcuc3RyaW5nVG9VVEY4KGZpbGVuYW1lLCBidWYsIGxlbik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1pc2NlbGxhbmVvdXNNb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgX2VtbmFwaV9nZXRfZmlsZW5hbWU6IF9lbW5hcGlfZ2V0X2ZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jcmVhdGVfcHJvbWlzZShlbnYsIGRlZmVycmVkLCBwcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3RJZCwgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZmVycmVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcHJvbWlzZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIHZhciBwID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVmZXJyZWRPYmplY3QgPSBlbW5hcGlDdHguY3JlYXRlRGVmZXJyZWQoeyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3RJZCA9IGRlZmVycmVkT2JqZWN0LmlkO1xuICAgICAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihkZWZlcnJlZCwgZGVmZXJyZWRPYmplY3RJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHApLmlkO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHByb21pc2UsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3Jlc29sdmVfZGVmZXJyZWQoZW52LCBkZWZlcnJlZCwgcmVzb2x1dGlvbikge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZlcnJlZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc29sdXRpb24pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlZmVycmVkT2JqZWN0ID0gZW1uYXBpQ3R4LmRlZmVycmVkU3RvcmUuZ2V0KGRlZmVycmVkKTtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZE9iamVjdC5yZXNvbHZlKGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfcmVqZWN0X2RlZmVycmVkKGVudiwgZGVmZXJyZWQsIHJlc29sdXRpb24pIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZGVmZXJyZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHV0aW9uKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBkZWZlcnJlZE9iamVjdCA9IGVtbmFwaUN0eC5kZWZlcnJlZFN0b3JlLmdldChkZWZlcnJlZCk7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWRPYmplY3QucmVqZWN0KGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmVzb2x1dGlvbikudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfcHJvbWlzZShlbnYsIHZhbHVlLCBpc19wcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIWlzX3Byb21pc2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNQcm9taXNlKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KGlzX3Byb21pc2UsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9taXNlTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfY3JlYXRlX3Byb21pc2U6IG5hcGlfY3JlYXRlX3Byb21pc2UsXG4gICAgICAgICAgICBuYXBpX2lzX3Byb21pc2U6IG5hcGlfaXNfcHJvbWlzZSxcbiAgICAgICAgICAgIG5hcGlfcmVqZWN0X2RlZmVycmVkOiBuYXBpX3JlamVjdF9kZWZlcnJlZCxcbiAgICAgICAgICAgIG5hcGlfcmVzb2x2ZV9kZWZlcnJlZDogbmFwaV9yZXNvbHZlX2RlZmVycmVkXG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcGlpaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCBrZXlfbW9kZSwga2V5X2ZpbHRlciwga2V5X2NvbnZlcnNpb24sIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBvYmogPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleV9tb2RlICE9PSAwIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9pbmNsdWRlX3Byb3RvdHlwZXMgKi8gJiYga2V5X21vZGUgIT09IDEgLyogbmFwaV9rZXlfY29sbGVjdGlvbl9tb2RlLm5hcGlfa2V5X293bl9vbmx5ICovKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXlfY29udmVyc2lvbiAhPT0gMCAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X2tlZXBfbnVtYmVycyAqLyAmJiBrZXlfY29udmVyc2lvbiAhPT0gMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIHN5bWJvbHMgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdmFyIG93biA9IHRydWU7XG4gICAgICAgICAgICAgICAgdmFyIGludGVnZXJJbmRpY2VSZWdleCA9IC9eKDB8WzEtOV1bMC05XSopJC87XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaW50ZWdlckluZGljZVJlZ2V4LnRlc3QobmFtZXNbaV0pID8gTnVtYmVyKG5hbWVzW2ldKSA6IG5hbWVzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lc1tpXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duOiBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzeW1ib2xzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2M6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW1ib2xzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd246IG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9tb2RlID09PSAxIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9vd25fb25seSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb2JqID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIG93biA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9iaik7XG4gICAgICAgICAgICAgICAgdmFyIHJldCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBhZGROYW1lID0gZnVuY3Rpb24gKHJldCwgbmFtZSwga2V5X2ZpbHRlciwgY29udmVyc2lvbl9tb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXQuaW5kZXhPZihuYW1lKSAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb252ZXJzaW9uX21vZGUgPT09IDAgLyogbmFwaV9rZXlfY29udmVyc2lvbi5uYXBpX2tleV9rZWVwX251bWJlcnMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnZlcnNpb25fbW9kZSA9PT0gMSAvKiBuYXBpX2tleV9jb252ZXJzaW9uLm5hcGlfa2V5X251bWJlcnNfdG9fc3RyaW5ncyAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWxOYW1lID0gdHlwZW9mIG5hbWUgPT09ICdudW1iZXInID8gU3RyaW5nKG5hbWUpIDogbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVhbE5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5X2ZpbHRlciAmIDggLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X3NraXBfc3RyaW5ncyAqLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocmVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHJlYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzEgPSBwcm9wLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZXNjID0gcHJvcC5kZXNjO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciA9PT0gMCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfYWxsX3Byb3BlcnRpZXMgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE5hbWUocmV0LCBuYW1lXzEsIGtleV9maWx0ZXIsIGtleV9jb252ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlfZmlsdGVyICYgOCAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zdHJpbmdzICovICYmIHR5cGVvZiBuYW1lXzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2ZpbHRlciAmIDE2IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9za2lwX3N5bWJvbHMgKi8gJiYgdHlwZW9mIG5hbWVfMSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRBZGQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlfZmlsdGVyICYgNykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfd3JpdGFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLndyaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfZW51bWVyYWJsZSAqLzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGQgPSBCb29sZWFuKGRlc2MuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy53cml0YWJsZSAmJiBkZXNjLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICg0IC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV9jb25maWd1cmFibGUgKi8gfCAxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLndyaXRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKDQgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2NvbmZpZ3VyYWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8pOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZCA9IEJvb2xlYW4oZGVzYy5jb25maWd1cmFibGUgJiYgZGVzYy5lbnVtZXJhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKDQgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2NvbmZpZ3VyYWJsZSAqLyB8IDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8gfCAxIC8qIG5hcGlfa2V5X2ZpbHRlci5uYXBpX2tleV93cml0YWJsZSAqLyk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQWRkID0gQm9vbGVhbihkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLmVudW1lcmFibGUgJiYgZGVzYy53cml0YWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lKHJldCwgbmFtZV8xLCBrZXlfZmlsdGVyLCBrZXlfY29udmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZW1uYXBpQ3R4LmFkZFRvQ3VycmVudFNjb3BlKHJldCkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lcyhlbnYsIG9iamVjdCwgcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzKGVudiwgb2JqZWN0LCAwIC8qIG5hcGlfa2V5X2NvbGxlY3Rpb25fbW9kZS5uYXBpX2tleV9pbmNsdWRlX3Byb3RvdHlwZXMgKi8sIDIgLyogbmFwaV9rZXlfZmlsdGVyLm5hcGlfa2V5X2VudW1lcmFibGUgKi8gfCAxNiAvKiBuYXBpX2tleV9maWx0ZXIubmFwaV9rZXlfc2tpcF9zeW1ib2xzICovLCAxIC8qIG5hcGlfa2V5X2NvbnZlcnNpb24ubmFwaV9rZXlfbnVtYmVyc190b19zdHJpbmdzICovLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaC52YWx1ZVtlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWVdID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWtleSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlIGluIHYpID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3Byb3BlcnR5KGVudiwgb2JqZWN0LCBrZXksIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWVdKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2RlbGV0ZV9wcm9wZXJ0eShlbnYsIG9iamVjdCwga2V5LCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5S2V5ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChrZXkpLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChlbW5hcGlDdHguZmVhdHVyZS5zdXBwb3J0UmVmbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICByID0gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShoLnZhbHVlLCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IGRlbGV0ZSBoLnZhbHVlW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIgPyAxIDogMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2hhc19vd25fcHJvcGVydHkoZW52LCBvYmplY3QsIGtleSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIGlmIChoLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB2ID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkgPyBoLnZhbHVlIDogT2JqZWN0KGgudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3AgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KGtleSkudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNCAvKiBuYXBpX3N0YXR1cy5uYXBpX25hbWVfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoa2V5KS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9zZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIGNuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWNuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KS52YWx1ZVtlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKGNuYW1lLCAtMSldID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaGFzX25hbWVkX3Byb3BlcnR5KGVudiwgb2JqZWN0LCB1dGY4bmFtZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByID0gZW1uYXBpU3RyaW5nLlVURjhUb1N0cmluZyh1dGY4bmFtZSwgLTEpIGluIHY7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciA/IDEgOiAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9nZXRfbmFtZWRfcHJvcGVydHkoZW52LCBvYmplY3QsIHV0ZjhuYW1lLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghdXRmOG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKGgudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdiA9IGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSA/IGgudmFsdWUgOiBPYmplY3QoaC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQodltlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhuYW1lLCAtMSldKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3NldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaC52YWx1ZVtpbmRleCA+Pj4gMF0gPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9oYXNfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHIgPSAoKGluZGV4ID4+PiAwKSBpbiB2KSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBpcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2dldF9lbGVtZW50KGVudiwgb2JqZWN0LCBpbmRleCwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoaC52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdiA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpID8gaC52YWx1ZSA6IE9iamVjdChoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZCh2W2luZGV4ID4+PiAwXSk7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwaXAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWxldGVfZWxlbWVudChlbnYsIG9iamVjdCwgaW5kZXgsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHI7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAoIShoLmlzT2JqZWN0KCkgfHwgaC5pc0Z1bmN0aW9uKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDIgLyogbmFwaV9zdGF0dXMubmFwaV9vYmplY3RfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZW1uYXBpQ3R4LmZlYXR1cmUuc3VwcG9ydFJlZmxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgciA9IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoaC52YWx1ZSwgaW5kZXggPj4+IDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBkZWxldGUgaC52YWx1ZVtpbmRleCA+Pj4gMF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByID8gMSA6IDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9kZWZpbmVfcHJvcGVydGllcyhlbnYsIG9iamVjdCwgcHJvcGVydHlfY291bnQsIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBwcm9wUHRyLCBhdHRyaWJ1dGVzO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlfY291bnQgPSBwcm9wZXJ0eV9jb3VudCA+Pj4gMDtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlfY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJvcGVydGllcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlfY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgICAgIHByb3BQdHIgPSBwcm9wZXJ0aWVzICsgKGkgKiAoNCAqIDgpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHV0ZjhOYW1lID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuYW1lXzIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgOCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBnZXR0ZXIgPSBIRUFQX0RBVEFfVklFVy5nZXRJbnQzMihwcm9wUHRyICsgMTIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2V0dGVyID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDE2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDIwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IEhFQVBfREFUQV9WSUVXLmdldEludDMyKHByb3BQdHIgKyAyNCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSEVBUF9EQVRBX1ZJRVcuZ2V0SW50MzIocHJvcFB0ciArIDI4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0ZjhOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBlbW5hcGlTdHJpbmcuVVRGOFRvU3RyaW5nKHV0ZjhOYW1lLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWVfMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDQgLyogbmFwaV9zdGF0dXMubmFwaV9uYW1lX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQobmFtZV8yKS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlOYW1lICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgcHJvcGVydHlOYW1lICE9PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDQgLyogbmFwaV9zdGF0dXMubmFwaV9uYW1lX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbW5hcGlEZWZpbmVQcm9wZXJ0eShlbnZPYmplY3QsIG1heWJlT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIG1ldGhvZCwgZ2V0dGVyLCBzZXR0ZXIsIHZhbHVlLCBhdHRyaWJ1dGVzLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9mcmVlemUoZW52LCBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBtYXliZU9iamVjdCA9IGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCEoaC5pc09iamVjdCgpIHx8IGguaXNGdW5jdGlvbigpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2JqZWN0X2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShtYXliZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX29iamVjdF9zZWFsKGVudiwgb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgbWF5YmVPYmplY3QgPSBoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghKGguaXNPYmplY3QoKSB8fCBoLmlzRnVuY3Rpb24oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMiAvKiBuYXBpX3N0YXR1cy5uYXBpX29iamVjdF9leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5zZWFsKG1heWJlT2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBwcm9wZXJ0eU1vZCA9IC8qI19fUFVSRV9fKi8gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICBuYXBpX2RlZmluZV9wcm9wZXJ0aWVzOiBuYXBpX2RlZmluZV9wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgbmFwaV9kZWxldGVfZWxlbWVudDogbmFwaV9kZWxldGVfZWxlbWVudCxcbiAgICAgICAgICAgIG5hcGlfZGVsZXRlX3Byb3BlcnR5OiBuYXBpX2RlbGV0ZV9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X2FsbF9wcm9wZXJ0eV9uYW1lczogbmFwaV9nZXRfYWxsX3Byb3BlcnR5X25hbWVzLFxuICAgICAgICAgICAgbmFwaV9nZXRfZWxlbWVudDogbmFwaV9nZXRfZWxlbWVudCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X25hbWVkX3Byb3BlcnR5OiBuYXBpX2dldF9uYW1lZF9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3Byb3BlcnR5OiBuYXBpX2dldF9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3Byb3BlcnR5X25hbWVzOiBuYXBpX2dldF9wcm9wZXJ0eV9uYW1lcyxcbiAgICAgICAgICAgIG5hcGlfaGFzX2VsZW1lbnQ6IG5hcGlfaGFzX2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX2hhc19uYW1lZF9wcm9wZXJ0eTogbmFwaV9oYXNfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX2hhc19vd25fcHJvcGVydHk6IG5hcGlfaGFzX293bl9wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfaGFzX3Byb3BlcnR5OiBuYXBpX2hhc19wcm9wZXJ0eSxcbiAgICAgICAgICAgIG5hcGlfb2JqZWN0X2ZyZWV6ZTogbmFwaV9vYmplY3RfZnJlZXplLFxuICAgICAgICAgICAgbmFwaV9vYmplY3Rfc2VhbDogbmFwaV9vYmplY3Rfc2VhbCxcbiAgICAgICAgICAgIG5hcGlfc2V0X2VsZW1lbnQ6IG5hcGlfc2V0X2VsZW1lbnQsXG4gICAgICAgICAgICBuYXBpX3NldF9uYW1lZF9wcm9wZXJ0eTogbmFwaV9zZXRfbmFtZWRfcHJvcGVydHksXG4gICAgICAgICAgICBuYXBpX3NldF9wcm9wZXJ0eTogbmFwaV9zZXRfcHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX3J1bl9zY3JpcHQoZW52LCBzY3JpcHQsIHJlc3VsdCkge1xuICAgICAgICAgICAgdmFyIHN0YXR1cztcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghc2NyaXB0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciB2OFNjcmlwdCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXY4U2NyaXB0LmlzU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMyAvKiBuYXBpX3N0YXR1cy5uYXBpX3N0cmluZ19leHBlY3RlZCAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBnID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8pLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciByZXQgPSBnLmV2YWwodjhTY3JpcHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGVJZChyZXQpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2NyaXB0TW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfcnVuX3NjcmlwdDogbmFwaV9ydW5fc2NyaXB0XG4gICAgICAgIH0pO1xuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV90eXBlb2YoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIHYgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKHYuaXNOdW1iZXIoKSkge1xuICAgICAgICAgICAgICAgIHIgPSAzIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfbnVtYmVyICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0JpZ0ludCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDkgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9iaWdpbnQgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICByID0gNCAvKiBuYXBpX3ZhbHVldHlwZS5uYXBpX3N0cmluZyAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBjb21lIGJlZm9yZSBJc09iamVjdCBiZWNhdXNlIElzRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBpbXBsaWVzIElzT2JqZWN0XG4gICAgICAgICAgICAgICAgciA9IDcgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9mdW5jdGlvbiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNFeHRlcm5hbCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXN0IGhhcyB0byBjb21lIGJlZm9yZSBJc09iamVjdCBiZWNhdXNlIElzRXh0ZXJuYWxcbiAgICAgICAgICAgICAgICAvLyBpbXBsaWVzIElzT2JqZWN0XG4gICAgICAgICAgICAgICAgciA9IDggLyogbmFwaV92YWx1ZXR5cGUubmFwaV9leHRlcm5hbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNPYmplY3QoKSkge1xuICAgICAgICAgICAgICAgIHIgPSA2IC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfb2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc0Jvb2xlYW4oKSkge1xuICAgICAgICAgICAgICAgIHIgPSAyIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfYm9vbGVhbiAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHYuaXNVbmRlZmluZWQoKSkge1xuICAgICAgICAgICAgICAgIHIgPSAwIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfdW5kZWZpbmVkICovO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodi5pc1N5bWJvbCgpKSB7XG4gICAgICAgICAgICAgICAgciA9IDUgLyogbmFwaV92YWx1ZXR5cGUubmFwaV9zeW1ib2wgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2LmlzTnVsbCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHIgPSAxIC8qIG5hcGlfdmFsdWV0eXBlLm5hcGlfbnVsbCAqLztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmUgdW5sZXNzIFY4IGhhcyBhZGRlZCBzb21lIG5ldyBraW5kIG9mIHZhbHVlLlxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fYm9vbChlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciB2O1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdiA9IGhhbmRsZS52YWx1ZSA/IDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8gOiAzIC8qIEdsb2JhbEhhbmRsZS5GQUxTRSAqLztcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDMyKHJlc3VsdCwgdiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9jb2VyY2VfdG9fbnVtYmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHY7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmlzQmlnSW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgYSBCaWdJbnQgdmFsdWUgdG8gYSBudW1iZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbW5hcGlDdHguYWRkVG9DdXJyZW50U2NvcGUoTnVtYmVyKGhhbmRsZS52YWx1ZSkpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19vYmplY3QoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgICAgIHYgPSBlbnZPYmplY3QuZW5zdXJlSGFuZGxlSWQoT2JqZWN0KGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50MzIocmVzdWx0LCB2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2NvZXJjZV90b19zdHJpbmcoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgdjtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LnRyeUNhdGNoLmlzRW1wdHkoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGlmICghZW52T2JqZWN0LmNhbkNhbGxJbnRvSnMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcihlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA+PSAxMCA/IDIzIC8qIG5hcGlfc3RhdHVzLm5hcGlfY2Fubm90X3J1bl9qcyAqLyA6IDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGUuaXNTeW1ib2woKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIHN0cmluZycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICAgICAgdiA9IGVtbmFwaUN0eC5hZGRUb0N1cnJlbnRTY29wZShTdHJpbmcoaGFuZGxlLnZhbHVlKSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQzMihyZXN1bHQsIHYsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2luc3RhbmNlb2YoZW52LCBvYmplY3QsIGNvbnN0cnVjdG9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB2YXIgY3RvciA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoY29uc3RydWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmICghY3Rvci5pc0Z1bmN0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoNSAvKiBuYXBpX3N0YXR1cy5uYXBpX2Z1bmN0aW9uX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQob2JqZWN0KS52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdmFsIGluc3RhbmNlb2YgY3Rvci52YWx1ZTtcbiAgICAgICAgICAgICAgICByID0gcmV0ID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuZ2V0UmV0dXJuU3RhdHVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZW52T2JqZWN0LnRyeUNhdGNoLnNldEVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYXJyYXkoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0FycmF5KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYXJyYXlidWZmZXIoZW52LCB2YWx1ZSwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgdmFyIGggPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gaC5pc0FycmF5QnVmZmVyKCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGF0ZShlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzRGF0ZSgpID8gMSA6IDA7XG4gICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIHIsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwcCAqL1xuICAgICAgICBmdW5jdGlvbiBuYXBpX2lzX2Vycm9yKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBlbW5hcGlDdHguaGFuZGxlU3RvcmUuZ2V0KHZhbHVlKS52YWx1ZTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByID0gKHZhbCBpbnN0YW5jZW9mIEVycm9yKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc190eXBlZGFycmF5KGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNUeXBlZEFycmF5KCkgPyAxIDogMDtcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgciwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfYnVmZmVyKGVudiwgdmFsdWUsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgciA9IGguaXNCdWZmZXIoZW1uYXBpQ3R4LmZlYXR1cmUuQnVmZmVyKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHAgKi9cbiAgICAgICAgZnVuY3Rpb24gbmFwaV9pc19kYXRhdmlldyhlbnYsIHZhbHVlLCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICB2YXIgaCA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQodmFsdWUpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIHIgPSBoLmlzRGF0YVZpZXcoKSA/IDEgOiAwO1xuICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQF9fc2lnIGlwcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfc3RyaWN0X2VxdWFscyhlbnYsIGxocywgcmhzLCByZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciByO1xuICAgICAgICAgICAgaWYgKCFlbnYpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLztcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIHZhciBlbnZPYmplY3QgPSBlbW5hcGlDdHguZW52U3RvcmUuZ2V0KGVudik7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2hlY2tHQ0FjY2VzcygpO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QudHJ5Q2F0Y2guaXNFbXB0eSgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgaWYgKCFlbnZPYmplY3QuY2FuQ2FsbEludG9KcygpKVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKGVudk9iamVjdC5tb2R1bGVBcGlWZXJzaW9uID49IDEwID8gMjMgLyogbmFwaV9zdGF0dXMubmFwaV9jYW5ub3RfcnVuX2pzICovIDogMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBlbnZPYmplY3QuY2xlYXJMYXN0RXJyb3IoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyaHMpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEgLyogbmFwaV9zdGF0dXMubmFwaV9pbnZhbGlkX2FyZyAqLyk7XG4gICAgICAgICAgICAgICAgdmFyIGx2ID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChsaHMpLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBydiA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQocmhzKS52YWx1ZTtcbiAgICAgICAgICAgICAgICByID0gKGx2ID09PSBydikgPyAxIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgSEVBUF9EQVRBX1ZJRVcgPSBuZXcgRGF0YVZpZXcod2FzbU1lbW9yeS5idWZmZXIpO1xuICAgICAgICAgICAgICAgIEhFQVBfREFUQV9WSUVXLnNldEludDgocmVzdWx0LCByLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmdldFJldHVyblN0YXR1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGVudk9iamVjdC50cnlDYXRjaC5zZXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnZPYmplY3Quc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyKGVudiwgYXJyYXlidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgZW52T2JqZWN0LmNoZWNrR0NBY2Nlc3MoKTtcbiAgICAgICAgICAgIGlmICghYXJyYXlidWZmZXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVtbmFwaUN0eC5oYW5kbGVTdG9yZS5nZXQoYXJyYXlidWZmZXIpLnZhbHVlO1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nICYmICh2YWx1ZSBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigyMCAvKiBuYXBpX3N0YXR1cy5uYXBpX2RldGFjaGFibGVfYXJyYXlidWZmZXJfZXhwZWN0ZWQgKi8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2FycmF5YnVmZmVyX2V4cGVjdGVkICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIE1lc3NhZ2VDaGFubmVsXzEgPSBlbW5hcGlDdHguZmVhdHVyZS5NZXNzYWdlQ2hhbm5lbDtcbiAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWxfMSgpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKHZhbHVlLCBbdmFsdWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoOSAvKiBuYXBpX3N0YXR1cy5uYXBpX2dlbmVyaWNfZmFpbHVyZSAqLyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LmNsZWFyTGFzdEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBfX3NpZyBpcHBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfaXNfZGV0YWNoZWRfYXJyYXlidWZmZXIoZW52LCBhcnJheWJ1ZmZlciwgcmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIWVudilcbiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgdmFyIGVudk9iamVjdCA9IGVtbmFwaUN0eC5lbnZTdG9yZS5nZXQoZW52KTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jaGVja0dDQWNjZXNzKCk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC50cnlDYXRjaC5pc0VtcHR5KCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMTAgLyogbmFwaV9zdGF0dXMubmFwaV9wZW5kaW5nX2V4Y2VwdGlvbiAqLyk7XG4gICAgICAgICAgICBpZiAoIWVudk9iamVjdC5jYW5DYWxsSW50b0pzKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoZW52T2JqZWN0Lm1vZHVsZUFwaVZlcnNpb24gPj0gMTAgPyAyMyAvKiBuYXBpX3N0YXR1cy5uYXBpX2Nhbm5vdF9ydW5fanMgKi8gOiAxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFycmF5YnVmZmVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi8pO1xuICAgICAgICAgICAgICAgIHZhciBoID0gZW1uYXBpQ3R4LmhhbmRsZVN0b3JlLmdldChhcnJheWJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgdmFyIEhFQVBfREFUQV9WSUVXID0gbmV3IERhdGFWaWV3KHdhc21NZW1vcnkuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoaC5pc0FycmF5QnVmZmVyKCkgJiYgaC52YWx1ZS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShoLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9EQVRBX1ZJRVcuc2V0SW50OChyZXN1bHQsIDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRJbnQ4KHJlc3VsdCwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5nZXRSZXR1cm5TdGF0dXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlbnZPYmplY3QudHJ5Q2F0Y2guc2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZW52T2JqZWN0LnNldExhc3RFcnJvcigxMCAvKiBuYXBpX3N0YXR1cy5uYXBpX3BlbmRpbmdfZXhjZXB0aW9uICovKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWVPcGVyYXRpb25Nb2QgPSAvKiNfX1BVUkVfXyovIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fYm9vbDogbmFwaV9jb2VyY2VfdG9fYm9vbCxcbiAgICAgICAgICAgIG5hcGlfY29lcmNlX3RvX251bWJlcjogbmFwaV9jb2VyY2VfdG9fbnVtYmVyLFxuICAgICAgICAgICAgbmFwaV9jb2VyY2VfdG9fb2JqZWN0OiBuYXBpX2NvZXJjZV90b19vYmplY3QsXG4gICAgICAgICAgICBuYXBpX2NvZXJjZV90b19zdHJpbmc6IG5hcGlfY29lcmNlX3RvX3N0cmluZyxcbiAgICAgICAgICAgIG5hcGlfZGV0YWNoX2FycmF5YnVmZmVyOiBuYXBpX2RldGFjaF9hcnJheWJ1ZmZlcixcbiAgICAgICAgICAgIG5hcGlfaW5zdGFuY2VvZjogbmFwaV9pbnN0YW5jZW9mLFxuICAgICAgICAgICAgbmFwaV9pc19hcnJheTogbmFwaV9pc19hcnJheSxcbiAgICAgICAgICAgIG5hcGlfaXNfYXJyYXlidWZmZXI6IG5hcGlfaXNfYXJyYXlidWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2J1ZmZlcjogbmFwaV9pc19idWZmZXIsXG4gICAgICAgICAgICBuYXBpX2lzX2RhdGF2aWV3OiBuYXBpX2lzX2RhdGF2aWV3LFxuICAgICAgICAgICAgbmFwaV9pc19kYXRlOiBuYXBpX2lzX2RhdGUsXG4gICAgICAgICAgICBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyOiBuYXBpX2lzX2RldGFjaGVkX2FycmF5YnVmZmVyLFxuICAgICAgICAgICAgbmFwaV9pc19lcnJvcjogbmFwaV9pc19lcnJvcixcbiAgICAgICAgICAgIG5hcGlfaXNfdHlwZWRhcnJheTogbmFwaV9pc190eXBlZGFycmF5LFxuICAgICAgICAgICAgbmFwaV9zdHJpY3RfZXF1YWxzOiBuYXBpX3N0cmljdF9lcXVhbHMsXG4gICAgICAgICAgICBuYXBpX3R5cGVvZjogbmFwaV90eXBlb2ZcbiAgICAgICAgfSk7XG4gICAgICAgIC8qKiBAX19zaWcgaXBwICovXG4gICAgICAgIGZ1bmN0aW9uIG5hcGlfZ2V0X3ZlcnNpb24oZW52LCByZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICghZW52KVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIG5hcGlfc3RhdHVzLm5hcGlfaW52YWxpZF9hcmcgKi87XG4gICAgICAgICAgICB2YXIgZW52T2JqZWN0ID0gZW1uYXBpQ3R4LmVudlN0b3JlLmdldChlbnYpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5zZXRMYXN0RXJyb3IoMSAvKiBuYXBpX3N0YXR1cy5uYXBpX2ludmFsaWRfYXJnICovKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIHZhciBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggPSAxMCAvKiBWZXJzaW9uLk5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAqLztcbiAgICAgICAgICAgIHZhciBIRUFQX0RBVEFfVklFVyA9IG5ldyBEYXRhVmlldyh3YXNtTWVtb3J5LmJ1ZmZlcik7XG4gICAgICAgICAgICBIRUFQX0RBVEFfVklFVy5zZXRVaW50MzIocmVzdWx0LCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVudk9iamVjdC5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2ZXJzaW9uTW9kID0gLyojX19QVVJFX18qLyBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIG5hcGlfZ2V0X3ZlcnNpb246IG5hcGlfZ2V0X3ZlcnNpb25cbiAgICAgICAgfSk7XG4gICAgICAgIGVtbmFwaUFXU1QuaW5pdCgpO1xuICAgICAgICBlbW5hcGlFeHRlcm5hbE1lbW9yeS5pbml0KCk7XG4gICAgICAgIGVtbmFwaVN0cmluZy5pbml0KCk7XG4gICAgICAgIGVtbmFwaVRTRk4uaW5pdCgpO1xuICAgICAgICBQVGhyZWFkLmluaXQoKTtcbiAgICAgICAgbmFwaU1vZHVsZS5lbW5hcGkuc3luY01lbW9yeSA9ICRlbW5hcGlTeW5jTWVtb3J5O1xuICAgICAgICBuYXBpTW9kdWxlLmVtbmFwaS5nZXRNZW1vcnlBZGRyZXNzID0gJGVtbmFwaUdldE1lbW9yeUFkZHJlc3M7XG4gICAgICAgIGZ1bmN0aW9uIGFkZEltcG9ydHMobW9kKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1vZCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB2YXIgayA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGsuaW5kZXhPZignJCcpID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoay5pbmRleE9mKCdlbW5hcGlfJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLmVtbmFwaVtrXSA9IG1vZFtrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoay5pbmRleE9mKCdfZW1uYXBpXycpID09PSAwIHx8IGsgPT09ICduYXBpX3NldF9sYXN0X2Vycm9yJyB8fCBrID09PSAnbmFwaV9jbGVhcl9sYXN0X2Vycm9yJykge1xuICAgICAgICAgICAgICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMuZW52W2tdID0gbW9kW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGlba10gPSBtb2Rba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFkZEltcG9ydHMoYXN5bmNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG1lbW9yeU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoYXN5bmNXb3JrTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh1dGlsTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhjb252ZXJ0MmNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGNvbnZlcnQybmFwaU1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoY3JlYXRlTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhnbG9iYWxNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHdyYXBNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGVudk1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZW1uYXBpTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhlcnJvck1vZCk7XG4gICAgICAgIGFkZEltcG9ydHMoZnVuY3Rpb25Nb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKGxpZmVNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG1pc2NlbGxhbmVvdXNNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKG5vZGVNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHByb21pc2VNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHByb3BlcnR5TW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyhzY3JpcHRNb2QpO1xuICAgICAgICBhZGRJbXBvcnRzKHZhbHVlT3BlcmF0aW9uTW9kKTtcbiAgICAgICAgYWRkSW1wb3J0cyh2ZXJzaW9uTW9kKTtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9jcmVhdGVfdGhyZWFkc2FmZV9mdW5jdGlvbiA9IG5hcGlfY3JlYXRlX3RocmVhZHNhZmVfZnVuY3Rpb247XG4gICAgICAgIG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLm5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dCA9IG5hcGlfZ2V0X3RocmVhZHNhZmVfZnVuY3Rpb25fY29udGV4dDtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9jYWxsX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2NhbGxfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9hY3F1aXJlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX2FjcXVpcmVfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV9yZWxlYXNlX3RocmVhZHNhZmVfZnVuY3Rpb24gPSBuYXBpX3JlbGVhc2VfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgbmFwaU1vZHVsZS5pbXBvcnRzLm5hcGkubmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV91bnJlZl90aHJlYWRzYWZlX2Z1bmN0aW9uO1xuICAgICAgICBuYXBpTW9kdWxlLmltcG9ydHMubmFwaS5uYXBpX3JlZl90aHJlYWRzYWZlX2Z1bmN0aW9uID0gbmFwaV9yZWZfdGhyZWFkc2FmZV9mdW5jdGlvbjtcbiAgICAgICAgcmV0dXJuIG5hcGlNb2R1bGU7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gbmFwaU1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRGbiwgdXNlck5hcGlNb2R1bGUsIHdhc21JbnB1dCwgb3B0aW9ucykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWFzc2VydGlvbnNcbiAgICBvcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgdmFyIGdldE1lbW9yeSA9IG9wdGlvbnMuZ2V0TWVtb3J5O1xuICAgIHZhciBnZXRUYWJsZSA9IG9wdGlvbnMuZ2V0VGFibGU7XG4gICAgdmFyIGJlZm9yZUluaXQgPSBvcHRpb25zLmJlZm9yZUluaXQ7XG4gICAgaWYgKGdldE1lbW9yeSAhPSBudWxsICYmIHR5cGVvZiBnZXRNZW1vcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucy5nZXRNZW1vcnkgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKGdldFRhYmxlICE9IG51bGwgJiYgdHlwZW9mIGdldFRhYmxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMuZ2V0VGFibGUgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgaWYgKGJlZm9yZUluaXQgIT0gbnVsbCAmJiB0eXBlb2YgYmVmb3JlSW5pdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLmJlZm9yZUluaXQgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdmFyIG5hcGlNb2R1bGU7XG4gICAgdmFyIGlzTG9hZCA9IHR5cGVvZiB1c2VyTmFwaU1vZHVsZSA9PT0gJ29iamVjdCcgJiYgdXNlck5hcGlNb2R1bGUgIT09IG51bGw7XG4gICAgaWYgKGlzTG9hZCkge1xuICAgICAgICBpZiAodXNlck5hcGlNb2R1bGUubG9hZGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25hcGlNb2R1bGUgaGFzIGFscmVhZHkgbG9hZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgbmFwaU1vZHVsZSA9IHVzZXJOYXBpTW9kdWxlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmFwaU1vZHVsZSA9IGNyZWF0ZU5hcGlNb2R1bGUob3B0aW9ucyk7XG4gICAgfVxuICAgIHZhciB3YXNpID0gb3B0aW9ucy53YXNpO1xuICAgIHZhciB3YXNpVGhyZWFkcztcbiAgICB2YXIgaW1wb3J0T2JqZWN0ID0ge1xuICAgICAgICBlbnY6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbnYsXG4gICAgICAgIG5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5uYXBpLFxuICAgICAgICBlbW5hcGk6IG5hcGlNb2R1bGUuaW1wb3J0cy5lbW5hcGlcbiAgICB9O1xuICAgIGlmICh3YXNpKSB7XG4gICAgICAgIHdhc2lUaHJlYWRzID0gbmV3IFdBU0lUaHJlYWRzKG5hcGlNb2R1bGUuY2hpbGRUaHJlYWRcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHdhc2k6IHdhc2ksXG4gICAgICAgICAgICAgICAgY2hpbGRUaHJlYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IG5hcGlNb2R1bGUucG9zdE1lc3NhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIHdhc2k6IHdhc2ksXG4gICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcjogbmFwaU1vZHVsZS5QVGhyZWFkLFxuICAgICAgICAgICAgICAgIHdhaXRUaHJlYWRTdGFydDogbmFwaU1vZHVsZS53YWl0VGhyZWFkU3RhcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGltcG9ydE9iamVjdCwgdHlwZW9mIHdhc2kuZ2V0SW1wb3J0T2JqZWN0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHdhc2kuZ2V0SW1wb3J0T2JqZWN0KClcbiAgICAgICAgICAgIDogeyB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiB3YXNpLndhc2lJbXBvcnQgfSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaW1wb3J0T2JqZWN0LCB3YXNpVGhyZWFkcy5nZXRJbXBvcnRPYmplY3QoKSk7XG4gICAgfVxuICAgIHZhciBvdmVyd3JpdGVJbXBvcnRzID0gb3B0aW9ucy5vdmVyd3JpdGVJbXBvcnRzO1xuICAgIGlmICh0eXBlb2Ygb3ZlcndyaXRlSW1wb3J0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbmV3SW1wb3J0T2JqZWN0ID0gb3ZlcndyaXRlSW1wb3J0cyhpbXBvcnRPYmplY3QpO1xuICAgICAgICBpZiAodHlwZW9mIG5ld0ltcG9ydE9iamVjdCA9PT0gJ29iamVjdCcgJiYgbmV3SW1wb3J0T2JqZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpbXBvcnRPYmplY3QgPSBuZXdJbXBvcnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvYWRGbih3YXNtSW5wdXQsIGltcG9ydE9iamVjdCwgZnVuY3Rpb24gKGVyciwgc291cmNlKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgb3JpZ2luYWxJbnN0YW5jZSA9IHNvdXJjZS5pbnN0YW5jZTtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gb3JpZ2luYWxJbnN0YW5jZTtcbiAgICAgICAgdmFyIG9yaWdpbmFsRXhwb3J0cyA9IG9yaWdpbmFsSW5zdGFuY2UuZXhwb3J0cztcbiAgICAgICAgdmFyIGV4cG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIG9yaWdpbmFsRXhwb3J0cztcbiAgICAgICAgdmFyIGltcG9ydE1lbW9yeSA9ICdtZW1vcnknIGluIGltcG9ydE9iamVjdC5lbnY7XG4gICAgICAgIHZhciBtZW1vcnkgPSBnZXRNZW1vcnlcbiAgICAgICAgICAgID8gZ2V0TWVtb3J5KG9yaWdpbmFsRXhwb3J0cylcbiAgICAgICAgICAgIDogZXhwb3J0TWVtb3J5XG4gICAgICAgICAgICAgICAgPyBvcmlnaW5hbEV4cG9ydHMubWVtb3J5XG4gICAgICAgICAgICAgICAgOiBpbXBvcnRNZW1vcnlcbiAgICAgICAgICAgICAgICAgICAgPyBpbXBvcnRPYmplY3QuZW52Lm1lbW9yeVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb3J5IGlzIG5laXRoZXIgZXhwb3J0ZWQgbm9yIGltcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUgPyBnZXRUYWJsZShvcmlnaW5hbEV4cG9ydHMpIDogb3JpZ2luYWxFeHBvcnRzLl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGU7XG4gICAgICAgIGlmICh3YXNpICYmICFleHBvcnRNZW1vcnkpIHtcbiAgICAgICAgICAgIHZhciBleHBvcnRzXzEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleHBvcnRzXzEsIG9yaWdpbmFsRXhwb3J0cywgeyBtZW1vcnk6IG1lbW9yeSB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0geyBleHBvcnRzOiBleHBvcnRzXzEgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW9kdWxlID0gc291cmNlLm1vZHVsZTtcbiAgICAgICAgaWYgKHdhc2kpIHtcbiAgICAgICAgICAgIGluc3RhbmNlID0gd2FzaVRocmVhZHMuaW5pdGlhbGl6ZShpbnN0YW5jZSwgbW9kdWxlLCBtZW1vcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbmFwaU1vZHVsZS5QVGhyZWFkLnNldHVwKG1vZHVsZSwgbWVtb3J5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW1uYXBpSW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVJbml0KSB7XG4gICAgICAgICAgICAgICAgYmVmb3JlSW5pdCh7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBvcmlnaW5hbEluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFwaU1vZHVsZS5pbml0KHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgbWVtb3J5OiBtZW1vcnksXG4gICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2U6IG9yaWdpbmFsSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgdXNlZEluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghaXNMb2FkKSB7XG4gICAgICAgICAgICAgICAgcmV0Lm5hcGlNb2R1bGUgPSBuYXBpTW9kdWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5hcGlNb2R1bGUuUFRocmVhZC5zaG91bGRQcmVsb2FkV29ya2VycygpKSB7XG4gICAgICAgICAgICB2YXIgcG9vbFJlYWR5ID0gbmFwaU1vZHVsZS5QVGhyZWFkLmxvYWRXYXNtTW9kdWxlVG9BbGxXb3JrZXJzKCk7XG4gICAgICAgICAgICBpZiAobG9hZEZuID09PSBsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9vbFJlYWR5LnRoZW4oZW1uYXBpSW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIGxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHdvcmtlciBwb29sIChyZXVzZVdvcmtlci5zaXplID4gMCknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW1uYXBpSW5pdCgpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gbG9hZENhbGxiYWNrKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBsb2FkKHdhc21JbnB1dCwgaW1wb3J0T2JqZWN0KS50aGVuKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHNvdXJjZSk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxvYWRTeW5jQ2FsbGJhY2sod2FzbUlucHV0LCBpbXBvcnRPYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNvdXJjZTtcbiAgICB0cnkge1xuICAgICAgICBzb3VyY2UgPSBsb2FkU3luYyh3YXNtSW5wdXQsIGltcG9ydE9iamVjdCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBzb3VyY2UpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlKG5hcGlNb2R1bGUsIFxuLyoqIE9ubHkgc3VwcG9ydCBgQnVmZmVyU291cmNlYCBvciBgV2ViQXNzZW1ibHkuTW9kdWxlYCBvbiBOb2RlLmpzICovXG53YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hcGlNb2R1bGUgIT09ICdvYmplY3QnIHx8IG5hcGlNb2R1bGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpTW9kdWxlJyk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZENhbGxiYWNrLCBuYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpO1xufVxuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGxvYWROYXBpTW9kdWxlU3luYyhuYXBpTW9kdWxlLCB3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG5hcGlNb2R1bGUgIT09ICdvYmplY3QnIHx8IG5hcGlNb2R1bGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBuYXBpTW9kdWxlJyk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZFN5bmNDYWxsYmFjaywgbmFwaU1vZHVsZSwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cbi8qKiBAcHVibGljICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZU5hcGlNb2R1bGUoXG4vKiogT25seSBzdXBwb3J0IGBCdWZmZXJTb3VyY2VgIG9yIGBXZWJBc3NlbWJseS5Nb2R1bGVgIG9uIE5vZGUuanMgKi9cbndhc21JbnB1dCwgb3B0aW9ucykge1xuICAgIHJldHVybiBsb2FkTmFwaU1vZHVsZUltcGwobG9hZENhbGxiYWNrLCB1bmRlZmluZWQsIHdhc21JbnB1dCwgb3B0aW9ucyk7XG59XG4vKiogQHB1YmxpYyAqL1xuZnVuY3Rpb24gaW5zdGFudGlhdGVOYXBpTW9kdWxlU3luYyh3YXNtSW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbG9hZE5hcGlNb2R1bGVJbXBsKGxvYWRTeW5jQ2FsbGJhY2ssIHVuZGVmaW5lZCwgd2FzbUlucHV0LCBvcHRpb25zKTtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbnZhciBNZXNzYWdlSGFuZGxlciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTWVzc2FnZUhhbmRsZXIsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTWVzc2FnZUhhbmRsZXIob3B0aW9ucykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25Mb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zLm9uTG9hZCBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgb3B0aW9ucykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFwaU1vZHVsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBNZXNzYWdlSGFuZGxlci5wcm90b3R5cGUuaW5zdGFudGlhdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgc291cmNlID0gdGhpcy5vbkxvYWQoZGF0YSk7XG4gICAgICAgIHZhciB0aGVuID0gc291cmNlLnRoZW47XG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5uYXBpTW9kdWxlID0gcmVzdWx0Lm5hcGlNb2R1bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFwaU1vZHVsZSA9IHNvdXJjZS5uYXBpTW9kdWxlO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH07XG4gICAgTWVzc2FnZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5oYW5kbGUuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgaWYgKChfYSA9IGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5kYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuX19lbW5hcGlfXykge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBlLmRhdGEuX19lbW5hcGlfXy50eXBlO1xuICAgICAgICAgICAgdmFyIHBheWxvYWRfMSA9IGUuZGF0YS5fX2VtbmFwaV9fLnBheWxvYWQ7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmtlci1pbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWZ0ZXJMb2FkKGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubmFwaU1vZHVsZS5pbml0V29ya2VyKHBheWxvYWRfMS5hcmcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ2FzeW5jLXdvcmstZXhlY3V0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFmdGVyTG9hZChlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm5hcGlNb2R1bGUuZXhlY3V0ZUFzeW5jV29yayhwYXlsb2FkXzEud29yayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBNZXNzYWdlSGFuZGxlcjtcbn0oVGhyZWFkTWVzc2FnZUhhbmRsZXIpKTtcblxudmFyIHZlcnNpb24gPSBcIjEuNC4zXCI7XG5cbmV4cG9ydCB7IE1lc3NhZ2VIYW5kbGVyLCBjcmVhdGVOYXBpTW9kdWxlLCBpbnN0YW50aWF0ZU5hcGlNb2R1bGUsIGluc3RhbnRpYXRlTmFwaU1vZHVsZVN5bmMsIGxvYWROYXBpTW9kdWxlLCBsb2FkTmFwaU1vZHVsZVN5bmMsIHZlcnNpb24gfTtcbiIsImltcG9ydCB7IF9fZXh0ZW5kcyB9IGZyb20gJ3RzbGliJztcblxudmFyIGV4dGVybmFsVmFsdWUgPSBuZXcgV2Vha01hcCgpO1xuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGlzRXh0ZXJuYWwob2JqZWN0KSB7XG4gICAgcmV0dXJuIGV4dGVybmFsVmFsdWUuaGFzKG9iamVjdCk7XG59XG4vKiogQHB1YmxpYyAqLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlZGVjbGFyZVxudmFyIEV4dGVybmFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFeHRlcm5hbCh2YWx1ZSkge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbnVsbCk7XG4gICAgICAgIGV4dGVybmFsVmFsdWUuc2V0KHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gICAgRXh0ZXJuYWwucHJvdG90eXBlID0gbnVsbDtcbiAgICByZXR1cm4gRXh0ZXJuYWw7XG59KSgpO1xuLyoqIEBwdWJsaWMgKi9cbmZ1bmN0aW9uIGdldEV4dGVybmFsVmFsdWUoZXh0ZXJuYWwpIHtcbiAgICBpZiAoIWlzRXh0ZXJuYWwoZXh0ZXJuYWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBleHRlcm5hbCcpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZXJuYWxWYWx1ZS5nZXQoZXh0ZXJuYWwpO1xufVxuXG52YXIgc3VwcG9ydE5ld0Z1bmN0aW9uID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBmO1xuICAgIHRyeSB7XG4gICAgICAgIGYgPSBuZXcgRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbic7XG59KSgpO1xudmFyIF9nbG9iYWwgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXM7XG4gICAgdmFyIGcgPSAoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSkoKTtcbiAgICBpZiAoIWcgJiYgc3VwcG9ydE5ld0Z1bmN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBnID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgIH1cbiAgICBpZiAoIWcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG4gICAgcmV0dXJuIGc7XG59KSgpO1xudmFyIFRyeUNhdGNoID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyeUNhdGNoKCkge1xuICAgICAgICB0aGlzLl9leGNlcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhdWdodCA9IGZhbHNlO1xuICAgIH1cbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9jYXVnaHQ7XG4gICAgfTtcbiAgICBUcnlDYXRjaC5wcm90b3R5cGUuaGFzQ2F1Z2h0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2F1Z2h0O1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLmV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4Y2VwdGlvbjtcbiAgICB9O1xuICAgIFRyeUNhdGNoLnByb3RvdHlwZS5zZXRFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uID0gZXJyO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jYXVnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZXhjZXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgVHJ5Q2F0Y2gucHJvdG90eXBlLmV4dHJhY3RFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlID0gdGhpcy5fZXhjZXB0aW9uO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH07XG4gICAgcmV0dXJuIFRyeUNhdGNoO1xufSgpKTtcbnZhciBjYW5TZXRGdW5jdGlvbk5hbWUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9hO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKChfYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlndXJhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pKCk7XG52YXIgc3VwcG9ydFJlZmxlY3QgPSB0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCc7XG52YXIgc3VwcG9ydEZpbmFsaXplciA9ICh0eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFdlYWtSZWYgIT09ICd1bmRlZmluZWQnKTtcbnZhciBzdXBwb3J0V2Vha1N5bWJvbCA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3ltYm9sLWRlc2NyaXB0aW9uXG4gICAgICAgIHZhciBzeW0gPSBTeW1ib2woKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICBuZXcgV2Vha1JlZihzeW0pO1xuICAgICAgICBuZXcgV2Vha01hcCgpLnNldChzeW0sIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59KSgpO1xudmFyIHN1cHBvcnRCaWdJbnQgPSB0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGlzUmVmZXJlbmNlVHlwZSh2KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPT0gbnVsbCkgfHwgdHlwZW9mIHYgPT09ICdmdW5jdGlvbic7XG59XG52YXIgX3JlcXVpcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5hdGl2ZVJlcXVpcmU7XG4gICAgaWYgKHR5cGVvZiBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbmF0aXZlUmVxdWlyZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fICE9PSAndW5kZWZpbmVkJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogdW5kZWZpbmVkO1xuICAgICAgICB9KSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbmF0aXZlUmVxdWlyZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIF9fd2VicGFja19wdWJsaWNfcGF0aF9fICE9PSAndW5kZWZpbmVkJyA/ICh0eXBlb2YgX19ub25fd2VicGFja19yZXF1aXJlX18gIT09ICd1bmRlZmluZWQnID8gX19ub25fd2VicGFja19yZXF1aXJlX18gOiB1bmRlZmluZWQpIDogKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gbmF0aXZlUmVxdWlyZTtcbn0pKCk7XG52YXIgX01lc3NhZ2VDaGFubmVsID0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAnZnVuY3Rpb24nXG4gICAgPyBNZXNzYWdlQ2hhbm5lbFxuICAgIDogLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIF9yZXF1aXJlKCd3b3JrZXJfdGhyZWFkcycpLk1lc3NhZ2VDaGFubmVsO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSgpO1xudmFyIF9zZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gICAgPyBzZXRJbW1lZGlhdGVcbiAgICA6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgICAgIHZhciBjaGFubmVsXzEgPSBuZXcgX01lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBjaGFubmVsXzEucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0MS5vbm1lc3NhZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGNoYW5uZWxfMSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoYW5uZWxfMS5wb3J0Mi5wb3N0TWVzc2FnZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9XG4gICAgfTtcbnZhciBfQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gQnVmZmVyXG4gICAgOiAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gX3JlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSkoKTtcbnZhciB2ZXJzaW9uID0gXCIxLjQuM1wiO1xudmFyIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiA9IDEgLyogVmVyc2lvbi5OT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NSU4gKi87XG52YXIgTk9ERV9BUElfU1VQUE9SVEVEX1ZFUlNJT05fTUFYID0gMTAgLyogVmVyc2lvbi5OT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVggKi87XG52YXIgTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCA9IDIxNDc0ODM2NDcgLyogVmVyc2lvbi5OQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMICovO1xudmFyIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OID0gOCAvKiBWZXJzaW9uLk5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OICovO1xuXG52YXIgSGFuZGxlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZShpZCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIEhhbmRsZS5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldEV4dGVybmFsVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzTnVtYmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0JpZ0ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLnZhbHVlID09PSAnYmlnaW50JztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNFeHRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGlzRXh0ZXJuYWwodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudmFsdWUgPT09ICdvYmplY3QnICYmIHRoaXMudmFsdWUgIT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0FycmF5QnVmZmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzVHlwZWRBcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChBcnJheUJ1ZmZlci5pc1ZpZXcodGhpcy52YWx1ZSkpICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNCdWZmZXIgPSBmdW5jdGlvbiAoQnVmZmVyQ29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLnZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBCdWZmZXJDb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiBCdWZmZXJDb25zdHJ1Y3RvciAhPT0gdm9pZCAwID8gQnVmZmVyQ29uc3RydWN0b3IgOiAoQnVmZmVyQ29uc3RydWN0b3IgPSBfQnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBCdWZmZXJDb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJiBCdWZmZXJDb25zdHJ1Y3Rvci5pc0J1ZmZlcih0aGlzLnZhbHVlKTtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNEYXRhVmlldyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRGF0YVZpZXcpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1Byb21pc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICAgIH07XG4gICAgSGFuZGxlLnByb3RvdHlwZS5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEhhbmRsZS5wcm90b3R5cGUuaXNTeW1ib2wgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N5bWJvbCc7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmlzTnVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IG51bGw7XG4gICAgfTtcbiAgICBIYW5kbGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gSGFuZGxlO1xufSgpKTtcbnZhciBDb25zdEhhbmRsZSA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ29uc3RIYW5kbGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ29uc3RIYW5kbGUoaWQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBpZCwgdmFsdWUpIHx8IHRoaXM7XG4gICAgfVxuICAgIENvbnN0SGFuZGxlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIHJldHVybiBDb25zdEhhbmRsZTtcbn0oSGFuZGxlKSk7XG52YXIgSGFuZGxlU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSGFuZGxlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlVOREVGSU5FRCxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLk5VTEwsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5GQUxTRSxcbiAgICAgICAgICAgIEhhbmRsZVN0b3JlLlRSVUUsXG4gICAgICAgICAgICBIYW5kbGVTdG9yZS5HTE9CQUxcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5fbmV4dCA9IEhhbmRsZVN0b3JlLk1JTl9JRDtcbiAgICB9XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIHZhciBuZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgaWYgKG5leHQgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBoID0gdmFsdWVzW25leHRdO1xuICAgICAgICAgICAgaC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaCA9IG5ldyBIYW5kbGUobmV4dCwgdmFsdWUpO1xuICAgICAgICAgICAgdmFsdWVzW25leHRdID0gaDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZXh0Kys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmVyYXNlID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdGhpcy5fbmV4dCA9IHN0YXJ0O1xuICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fdmFsdWVzO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgdmFsdWVzW2ldLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIEhhbmRsZVN0b3JlLnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMuX3ZhbHVlcztcbiAgICAgICAgdmFyIGggPSB2YWx1ZXNbYV07XG4gICAgICAgIHZhbHVlc1thXSA9IHZhbHVlc1tiXTtcbiAgICAgICAgdmFsdWVzW2FdLmlkID0gTnVtYmVyKGEpO1xuICAgICAgICB2YWx1ZXNbYl0gPSBoO1xuICAgICAgICBoLmlkID0gTnVtYmVyKGIpO1xuICAgIH07XG4gICAgSGFuZGxlU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGggPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgICAgIHRoaXMuX25leHQgPSBIYW5kbGVTdG9yZS5NSU5fSUQ7XG4gICAgfTtcbiAgICBIYW5kbGVTdG9yZS5VTkRFRklORUQgPSBuZXcgQ29uc3RIYW5kbGUoMSAvKiBHbG9iYWxIYW5kbGUuVU5ERUZJTkVEICovLCB1bmRlZmluZWQpO1xuICAgIEhhbmRsZVN0b3JlLk5VTEwgPSBuZXcgQ29uc3RIYW5kbGUoMiAvKiBHbG9iYWxIYW5kbGUuTlVMTCAqLywgbnVsbCk7XG4gICAgSGFuZGxlU3RvcmUuRkFMU0UgPSBuZXcgQ29uc3RIYW5kbGUoMyAvKiBHbG9iYWxIYW5kbGUuRkFMU0UgKi8sIGZhbHNlKTtcbiAgICBIYW5kbGVTdG9yZS5UUlVFID0gbmV3IENvbnN0SGFuZGxlKDQgLyogR2xvYmFsSGFuZGxlLlRSVUUgKi8sIHRydWUpO1xuICAgIEhhbmRsZVN0b3JlLkdMT0JBTCA9IG5ldyBDb25zdEhhbmRsZSg1IC8qIEdsb2JhbEhhbmRsZS5HTE9CQUwgKi8sIF9nbG9iYWwpO1xuICAgIEhhbmRsZVN0b3JlLk1JTl9JRCA9IDY7XG4gICAgcmV0dXJuIEhhbmRsZVN0b3JlO1xufSgpKTtcblxudmFyIEhhbmRsZVNjb3BlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEhhbmRsZVNjb3BlKGhhbmRsZVN0b3JlLCBpZCwgcGFyZW50U2NvcGUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IHN0YXJ0OyB9XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBoYW5kbGVTdG9yZTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudFNjb3BlO1xuICAgICAgICB0aGlzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlICE9PSBudWxsKVxuICAgICAgICAgICAgcGFyZW50U2NvcGUuY2hpbGQgPSB0aGlzO1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgICAgICB0aGlzLl9lc2NhcGVDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0luZm8gPSB7XG4gICAgICAgICAgICB0aGl6OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkYXRhOiAwLFxuICAgICAgICAgICAgYXJnczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZm46IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgIH1cbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgdGhpcy5lbmQrKztcbiAgICAgICAgcmV0dXJuIGg7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuYWRkRXh0ZXJuYWwgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGQobmV3IEV4dGVybmFsKGRhdGEpKTtcbiAgICB9O1xuICAgIEhhbmRsZVNjb3BlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgdGhpcy5fZXNjYXBlQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0ID09PSB0aGlzLmVuZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5lcmFzZSh0aGlzLnN0YXJ0LCB0aGlzLmVuZCk7XG4gICAgfTtcbiAgICBIYW5kbGVTY29wZS5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKGhhbmRsZSkge1xuICAgICAgICBpZiAodGhpcy5fZXNjYXBlQ2FsbGVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHRoaXMuX2VzY2FwZUNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChoYW5kbGUgPCB0aGlzLnN0YXJ0IHx8IGhhbmRsZSA+PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVTdG9yZS5zd2FwKGhhbmRsZSwgdGhpcy5zdGFydCk7XG4gICAgICAgIHZhciBoID0gdGhpcy5oYW5kbGVTdG9yZS5nZXQodGhpcy5zdGFydCk7XG4gICAgICAgIHRoaXMuc3RhcnQrKztcbiAgICAgICAgdGhpcy5wYXJlbnQuZW5kKys7XG4gICAgICAgIHJldHVybiBoO1xuICAgIH07XG4gICAgSGFuZGxlU2NvcGUucHJvdG90eXBlLmVzY2FwZUNhbGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VzY2FwZUNhbGxlZDtcbiAgICB9O1xuICAgIHJldHVybiBIYW5kbGVTY29wZTtcbn0oKSk7XG5cbnZhciBTY29wZVN0b3JlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNjb3BlU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3Jvb3RTY29wZSA9IG5ldyBIYW5kbGVTY29wZShudWxsLCAwLCBudWxsLCAxLCBIYW5kbGVTdG9yZS5NSU5fSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLm9wZW5TY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRTY29wZSA9IHRoaXMuY3VycmVudFNjb3BlO1xuICAgICAgICB2YXIgc2NvcGUgPSBjdXJyZW50U2NvcGUuY2hpbGQ7XG4gICAgICAgIGlmIChzY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2NvcGUuc3RhcnQgPSBzY29wZS5lbmQgPSBjdXJyZW50U2NvcGUuZW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGlkID0gY3VycmVudFNjb3BlLmlkICsgMTtcbiAgICAgICAgICAgIHNjb3BlID0gbmV3IEhhbmRsZVNjb3BlKGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUsIGlkLCBjdXJyZW50U2NvcGUsIGN1cnJlbnRTY29wZS5lbmQpO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IHNjb3BlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gc2NvcGU7XG4gICAgICAgIGVudk9iamVjdC5vcGVuSGFuZGxlU2NvcGVzKys7XG4gICAgICAgIHJldHVybiBzY29wZTtcbiAgICB9O1xuICAgIFNjb3BlU3RvcmUucHJvdG90eXBlLmNsb3NlU2NvcGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0KSB7XG4gICAgICAgIGlmIChlbnZPYmplY3Qub3BlbkhhbmRsZVNjb3BlcyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdXJyZW50U2NvcGU7XG4gICAgICAgIHRoaXMuY3VycmVudFNjb3BlID0gc2NvcGUucGFyZW50O1xuICAgICAgICBzY29wZS5kaXNwb3NlKCk7XG4gICAgICAgIGVudk9iamVjdC5vcGVuSGFuZGxlU2NvcGVzLS07XG4gICAgfTtcbiAgICBTY29wZVN0b3JlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRTY29wZSA9IHRoaXMuX3Jvb3RTY29wZTtcbiAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDE7XG4gICAgfTtcbiAgICByZXR1cm4gU2NvcGVTdG9yZTtcbn0oKSk7XG5cbnZhciBSZWZUcmFja2VyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlZlRyYWNrZXIoKSB7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbiAgICB9XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmVHJhY2tlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS5saW5rID0gZnVuY3Rpb24gKGxpc3QpIHtcbiAgICAgICAgdGhpcy5fcHJldiA9IGxpc3Q7XG4gICAgICAgIHRoaXMuX25leHQgPSBsaXN0Ll9uZXh0O1xuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5fbmV4dCA9IHRoaXM7XG4gICAgfTtcbiAgICBSZWZUcmFja2VyLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2Ll9uZXh0ID0gdGhpcy5fbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbmV4dC5fcHJldiA9IHRoaXMuX3ByZXY7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7XG4gICAgICAgIHRoaXMuX25leHQgPSBudWxsO1xuICAgIH07XG4gICAgUmVmVHJhY2tlci5maW5hbGl6ZUFsbCA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgIHdoaWxlIChsaXN0Ll9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsaXN0Ll9uZXh0LmZpbmFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBSZWZUcmFja2VyO1xufSgpKTtcblxudmFyIEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGaW5hbGl6ZXIoZW52T2JqZWN0LCBfZmluYWxpemVDYWxsYmFjaywgX2ZpbmFsaXplRGF0YSwgX2ZpbmFsaXplSGludCkge1xuICAgICAgICBpZiAoX2ZpbmFsaXplQ2FsbGJhY2sgPT09IHZvaWQgMCkgeyBfZmluYWxpemVDYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKF9maW5hbGl6ZURhdGEgPT09IHZvaWQgMCkgeyBfZmluYWxpemVEYXRhID0gMDsgfVxuICAgICAgICBpZiAoX2ZpbmFsaXplSGludCA9PT0gdm9pZCAwKSB7IF9maW5hbGl6ZUhpbnQgPSAwOyB9XG4gICAgICAgIHRoaXMuZW52T2JqZWN0ID0gZW52T2JqZWN0O1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrID0gX2ZpbmFsaXplQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplRGF0YSA9IF9maW5hbGl6ZURhdGE7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplSGludCA9IF9maW5hbGl6ZUhpbnQ7XG4gICAgICAgIHRoaXMuX21ha2VEeW5DYWxsX3ZwcHAgPSBlbnZPYmplY3QubWFrZUR5bkNhbGxfdnBwcDtcbiAgICB9XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2s7IH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZmluYWxpemVEYXRhOyB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUuaGludCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2ZpbmFsaXplSGludDsgfTtcbiAgICBGaW5hbGl6ZXIucHJvdG90eXBlLnJlc2V0RW52ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIEZpbmFsaXplci5wcm90b3R5cGUucmVzZXRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplQ2FsbGJhY2sgPSAwO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZURhdGEgPSAwO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUhpbnQgPSAwO1xuICAgIH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5jYWxsRmluYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZmluYWxpemVfY2FsbGJhY2sgPSB0aGlzLl9maW5hbGl6ZUNhbGxiYWNrO1xuICAgICAgICB2YXIgZmluYWxpemVfZGF0YSA9IHRoaXMuX2ZpbmFsaXplRGF0YTtcbiAgICAgICAgdmFyIGZpbmFsaXplX2hpbnQgPSB0aGlzLl9maW5hbGl6ZUhpbnQ7XG4gICAgICAgIHRoaXMucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICAgICAgaWYgKCFmaW5hbGl6ZV9jYWxsYmFjaylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGZpbmkgPSBOdW1iZXIoZmluYWxpemVfY2FsbGJhY2spO1xuICAgICAgICBpZiAoIXRoaXMuZW52T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlRHluQ2FsbF92cHBwKGZpbmkpKDAsIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbnZPYmplY3QuY2FsbEZpbmFsaXplcihmaW5pLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRmluYWxpemVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fbWFrZUR5bkNhbGxfdnBwcCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBGaW5hbGl6ZXI7XG59KCkpO1xuXG52YXIgVHJhY2tlZEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoVHJhY2tlZEZpbmFsaXplciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUcmFja2VkRmluYWxpemVyKGVudk9iamVjdCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2ZpbmFsaXplciA9IG5ldyBGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgVHJhY2tlZEZpbmFsaXplci5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgZmluYWxpemVyID0gbmV3IFRyYWNrZWRGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIGZpbmFsaXplci5saW5rKGVudk9iamVjdC5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICByZXR1cm4gZmluYWxpemVyO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplci5kYXRhKCk7XG4gICAgfTtcbiAgICBUcmFja2VkRmluYWxpemVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpbmFsaXplcilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51bmxpbmsoKTtcbiAgICAgICAgdGhpcy5fZmluYWxpemVyLmVudk9iamVjdC5kZXF1ZXVlRmluYWxpemVyKHRoaXMpO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgIH07XG4gICAgVHJhY2tlZEZpbmFsaXplci5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHZhciBlcnJvcjtcbiAgICAgICAgdmFyIGNhdWdodCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fZmluYWxpemVyLmNhbGxGaW5hbGl6ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjYXVnaHQgPSB0cnVlO1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2tlZEZpbmFsaXplcjtcbn0oUmVmVHJhY2tlcikpO1xuXG5mdW5jdGlvbiB0aHJvd05vZGVBcGlWZXJzaW9uRXJyb3IobW9kdWxlTmFtZSwgbW9kdWxlQXBpVmVyc2lvbikge1xuICAgIHZhciBlcnJvck1lc3NhZ2UgPSBcIlwiLmNvbmNhdChtb2R1bGVOYW1lLCBcIiByZXF1aXJlcyBOb2RlLUFQSSB2ZXJzaW9uIFwiKS5jb25jYXQobW9kdWxlQXBpVmVyc2lvbiwgXCIsIGJ1dCB0aGlzIHZlcnNpb24gb2YgTm9kZS5qcyBvbmx5IHN1cHBvcnRzIHZlcnNpb24gXCIpLmNvbmNhdChOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIFwiIGFkZC1vbnMuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gaGFuZGxlVGhyb3coZW52T2JqZWN0LCB2YWx1ZSkge1xuICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IHZhbHVlO1xufVxudmFyIEVudiA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFbnYoY3R4LCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQpIHtcbiAgICAgICAgdGhpcy5jdHggPSBjdHg7XG4gICAgICAgIHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9IG1vZHVsZUFwaVZlcnNpb247XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnBwcCA9IG1ha2VEeW5DYWxsX3ZwcHA7XG4gICAgICAgIHRoaXMubWFrZUR5bkNhbGxfdnAgPSBtYWtlRHluQ2FsbF92cDtcbiAgICAgICAgdGhpcy5hYm9ydCA9IGFib3J0O1xuICAgICAgICB0aGlzLm9wZW5IYW5kbGVTY29wZXMgPSAwO1xuICAgICAgICB0aGlzLmluc3RhbmNlRGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2ggPSBuZXcgVHJ5Q2F0Y2goKTtcbiAgICAgICAgdGhpcy5yZWZzID0gMTtcbiAgICAgICAgdGhpcy5yZWZsaXN0ID0gbmV3IFJlZlRyYWNrZXIoKTtcbiAgICAgICAgdGhpcy5maW5hbGl6aW5nX3JlZmxpc3QgPSBuZXcgUmVmVHJhY2tlcigpO1xuICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzID0gW107XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0ge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8sXG4gICAgICAgICAgICBlbmdpbmVFcnJvckNvZGU6IDAsXG4gICAgICAgICAgICBlbmdpbmVSZXNlcnZlZDogMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluR2NGaW5hbGl6ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYmluZGluZ01hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHRoaXMuaWQgPSAwO1xuICAgIH1cbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmNhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS50ZXJtaW5hdGVkT3JUZXJtaW5hdGluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNhbkNhbGxJbnRvSnMoKTtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlZnMrKztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucmVmcy0tO1xuICAgICAgICBpZiAodGhpcy5yZWZzID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5lbnN1cmVIYW5kbGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3R4LmVuc3VyZUhhbmRsZSh2YWx1ZSk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmVuc3VyZUhhbmRsZUlkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuc3VyZUhhbmRsZSh2YWx1ZSkuaWQ7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmNsZWFyTGFzdEVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFzdEVycm9yID0gdGhpcy5sYXN0RXJyb3I7XG4gICAgICAgIGlmIChsYXN0RXJyb3IuZXJyb3JDb2RlICE9PSAwIC8qIG5hcGlfc3RhdHVzLm5hcGlfb2sgKi8pXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gMCAvKiBuYXBpX3N0YXR1cy5uYXBpX29rICovO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSAhPT0gMClcbiAgICAgICAgICAgIGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgPSAwO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSAwKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZVJlc2VydmVkID0gMDtcbiAgICAgICAgcmV0dXJuIDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLztcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuc2V0TGFzdEVycm9yID0gZnVuY3Rpb24gKGVycm9yX2NvZGUsIGVuZ2luZV9lcnJvcl9jb2RlLCBlbmdpbmVfcmVzZXJ2ZWQpIHtcbiAgICAgICAgaWYgKGVuZ2luZV9lcnJvcl9jb2RlID09PSB2b2lkIDApIHsgZW5naW5lX2Vycm9yX2NvZGUgPSAwOyB9XG4gICAgICAgIGlmIChlbmdpbmVfcmVzZXJ2ZWQgPT09IHZvaWQgMCkgeyBlbmdpbmVfcmVzZXJ2ZWQgPSAwOyB9XG4gICAgICAgIHZhciBsYXN0RXJyb3IgPSB0aGlzLmxhc3RFcnJvcjtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lcnJvckNvZGUgIT09IGVycm9yX2NvZGUpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZXJyb3JDb2RlID0gZXJyb3JfY29kZTtcbiAgICAgICAgaWYgKGxhc3RFcnJvci5lbmdpbmVFcnJvckNvZGUgIT09IGVuZ2luZV9lcnJvcl9jb2RlKVxuICAgICAgICAgICAgbGFzdEVycm9yLmVuZ2luZUVycm9yQ29kZSA9IGVuZ2luZV9lcnJvcl9jb2RlO1xuICAgICAgICBpZiAobGFzdEVycm9yLmVuZ2luZVJlc2VydmVkICE9PSBlbmdpbmVfcmVzZXJ2ZWQpXG4gICAgICAgICAgICBsYXN0RXJyb3IuZW5naW5lUmVzZXJ2ZWQgPSBlbmdpbmVfcmVzZXJ2ZWQ7XG4gICAgICAgIHJldHVybiBlcnJvcl9jb2RlO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRSZXR1cm5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50cnlDYXRjaC5oYXNDYXVnaHQoKSA/IDAgLyogbmFwaV9zdGF0dXMubmFwaV9vayAqLyA6IHRoaXMuc2V0TGFzdEVycm9yKDEwIC8qIG5hcGlfc3RhdHVzLm5hcGlfcGVuZGluZ19leGNlcHRpb24gKi8pO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5jYWxsSW50b01vZHVsZSA9IGZ1bmN0aW9uIChmbiwgaGFuZGxlRXhjZXB0aW9uKSB7XG4gICAgICAgIGlmIChoYW5kbGVFeGNlcHRpb24gPT09IHZvaWQgMCkgeyBoYW5kbGVFeGNlcHRpb24gPSBoYW5kbGVUaHJvdzsgfVxuICAgICAgICB2YXIgb3BlbkhhbmRsZVNjb3Blc0JlZm9yZSA9IHRoaXMub3BlbkhhbmRsZVNjb3BlcztcbiAgICAgICAgdGhpcy5jbGVhckxhc3RFcnJvcigpO1xuICAgICAgICB2YXIgciA9IGZuKHRoaXMpO1xuICAgICAgICBpZiAob3BlbkhhbmRsZVNjb3Blc0JlZm9yZSAhPT0gdGhpcy5vcGVuSGFuZGxlU2NvcGVzKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCdvcGVuX2hhbmRsZV9zY29wZXMgIT0gb3Blbl9oYW5kbGVfc2NvcGVzX2JlZm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRyeUNhdGNoLmhhc0NhdWdodCgpKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gdGhpcy50cnlDYXRjaC5leHRyYWN0RXhjZXB0aW9uKCk7XG4gICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24odGhpcywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuaW52b2tlRmluYWxpemVyRnJvbUdDID0gZnVuY3Rpb24gKGZpbmFsaXplcikge1xuICAgICAgICBpZiAodGhpcy5tb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgICAgICB0aGlzLmVucXVldWVGaW5hbGl6ZXIoZmluYWxpemVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzYXZlZCA9IHRoaXMuaW5HY0ZpbmFsaXplcjtcbiAgICAgICAgICAgIHRoaXMuaW5HY0ZpbmFsaXplciA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZpbmFsaXplci5maW5hbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbkdjRmluYWxpemVyID0gc2F2ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEVudi5wcm90b3R5cGUuY2hlY2tHQ0FjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMubW9kdWxlQXBpVmVyc2lvbiA9PT0gTkFQSV9WRVJTSU9OX0VYUEVSSU1FTlRBTCAmJiB0aGlzLmluR2NGaW5hbGl6ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoJ0ZpbmFsaXplciBpcyBjYWxsaW5nIGEgZnVuY3Rpb24gdGhhdCBtYXkgYWZmZWN0IEdDIHN0YXRlLlxcbicgK1xuICAgICAgICAgICAgICAgICdUaGUgZmluYWxpemVycyBhcmUgcnVuIGRpcmVjdGx5IGZyb20gR0MgYW5kIG11c3Qgbm90IGFmZmVjdCBHQyAnICtcbiAgICAgICAgICAgICAgICAnc3RhdGUuXFxuJyArXG4gICAgICAgICAgICAgICAgJ1VzZSBgbm9kZV9hcGlfcG9zdF9maW5hbGl6ZXJgIGZyb20gaW5zaWRlIG9mIHRoZSBmaW5hbGl6ZXIgdG8gd29yayAnICtcbiAgICAgICAgICAgICAgICAnYXJvdW5kIHRoaXMgaXNzdWUuXFxuJyArXG4gICAgICAgICAgICAgICAgJ0l0IHNjaGVkdWxlcyB0aGUgY2FsbCBhcyBhIG5ldyB0YXNrIGluIHRoZSBldmVudCBsb29wLicpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLmluZGV4T2YoZmluYWxpemVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0ZpbmFsaXplcnMucHVzaChmaW5hbGl6ZXIpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBFbnYucHJvdG90eXBlLmRlcXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuaW5kZXhPZihmaW5hbGl6ZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdGaW5hbGl6ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIEVudi5wcm90b3R5cGUuZGVsZXRlTWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFJlZlRyYWNrZXIuZmluYWxpemVBbGwodGhpcy5maW5hbGl6aW5nX3JlZmxpc3QpO1xuICAgICAgICBSZWZUcmFja2VyLmZpbmFsaXplQWxsKHRoaXMucmVmbGlzdCk7XG4gICAgICAgIHRoaXMudHJ5Q2F0Y2guZXh0cmFjdEV4Y2VwdGlvbigpO1xuICAgICAgICB0aGlzLmN0eC5lbnZTdG9yZS5yZW1vdmUodGhpcy5pZCk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmlkID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmRlbGV0ZU1lKCk7XG4gICAgICAgIHRoaXMuZmluYWxpemluZ19yZWZsaXN0LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5yZWZsaXN0LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmluaXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBiaW5kaW5nID0ge1xuICAgICAgICAgICAgd3JhcHBlZDogMCxcbiAgICAgICAgICAgIHRhZzogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nTWFwLnNldCh2YWx1ZSwgYmluZGluZyk7XG4gICAgICAgIHJldHVybiBiaW5kaW5nO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5nZXRPYmplY3RCaW5kaW5nID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9iaW5kaW5nTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nTWFwLmdldCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdE9iamVjdEJpbmRpbmcodmFsdWUpO1xuICAgIH07XG4gICAgRW52LnByb3RvdHlwZS5zZXRJbnN0YW5jZURhdGEgPSBmdW5jdGlvbiAoZGF0YSwgZmluYWxpemVfY2IsIGZpbmFsaXplX2hpbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlRGF0YS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnN0YW5jZURhdGEgPSBUcmFja2VkRmluYWxpemVyLmNyZWF0ZSh0aGlzLCBmaW5hbGl6ZV9jYiwgZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgfTtcbiAgICBFbnYucHJvdG90eXBlLmdldEluc3RhbmNlRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VEYXRhID8gdGhpcy5pbnN0YW5jZURhdGEuZGF0YSgpIDogMDtcbiAgICB9O1xuICAgIHJldHVybiBFbnY7XG59KCkpO1xudmFyIE5vZGVFbnYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKE5vZGVFbnYsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGN0eCwgbW9kdWxlQXBpVmVyc2lvbiwgbWFrZUR5bkNhbGxfdnBwcCwgbWFrZUR5bkNhbGxfdnAsIGFib3J0KSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICBfdGhpcy5ub2RlQmluZGluZyA9IG5vZGVCaW5kaW5nO1xuICAgICAgICBfdGhpcy5kZXN0cnVjdGluZyA9IGZhbHNlO1xuICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBOb2RlRW52LnByb3RvdHlwZS5kZWxldGVNZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kZXN0cnVjdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZHJhaW5GaW5hbGl6ZXJRdWV1ZSgpO1xuICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlbGV0ZU1lLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYW5DYWxsSW50b0pzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5jYW5DYWxsSW50b0pzLmNhbGwodGhpcykgJiYgdGhpcy5jdHguY2FuQ2FsbEludG9KcygpO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUudHJpZ2dlckZhdGFsRXhjZXB0aW9uID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAodGhpcy5ub2RlQmluZGluZykge1xuICAgICAgICAgICAgdGhpcy5ub2RlQmluZGluZy5uYXBpLmZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGwgJiYgdHlwZW9mIHByb2Nlc3MuX2ZhdGFsRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZWQgPSBwcm9jZXNzLl9mYXRhbEV4Y2VwdGlvbihlcnIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmNhbGxiYWNrSW50b01vZHVsZSA9IGZ1bmN0aW9uIChlbmZvcmNlVW5jYXVnaHRFeGNlcHRpb25Qb2xpY3ksIGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxJbnRvTW9kdWxlKGZuLCBmdW5jdGlvbiAoZW52T2JqZWN0LCBlcnIpIHtcbiAgICAgICAgICAgIGlmIChlbnZPYmplY3QudGVybWluYXRlZE9yVGVybWluYXRpbmcoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBoYXNQcm9jZXNzID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHByb2Nlc3MgIT09IG51bGw7XG4gICAgICAgICAgICB2YXIgaGFzRm9yY2VGbGFnID0gaGFzUHJvY2VzcyA/IEJvb2xlYW4ocHJvY2Vzcy5leGVjQXJndiAmJiAocHJvY2Vzcy5leGVjQXJndi5pbmRleE9mKCctLWZvcmNlLW5vZGUtYXBpLXVuY2F1Z2h0LWV4Y2VwdGlvbnMtcG9saWN5JykgIT09IC0xKSkgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChlbnZPYmplY3QubW9kdWxlQXBpVmVyc2lvbiA8IDEwICYmICFoYXNGb3JjZUZsYWcgJiYgIWVuZm9yY2VVbmNhdWdodEV4Y2VwdGlvblBvbGljeSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXJuID0gaGFzUHJvY2VzcyAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/IHByb2Nlc3MuZW1pdFdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAod2FybmluZywgdHlwZSwgY29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeCA9IGNvZGUgPyBcIltcIi5jb25jYXQoY29kZSwgXCJdIFwiKSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdCh0eXBlIHx8ICdXYXJuaW5nJywgXCI6IFwiKS5jb25jYXQod2FybmluZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHdhcm4oJ1VuY2F1Z2h0IE4tQVBJIGNhbGxiYWNrIGV4Y2VwdGlvbiBkZXRlY3RlZCwgcGxlYXNlIHJ1biBub2RlIHdpdGggb3B0aW9uIC0tZm9yY2Utbm9kZS1hcGktdW5jYXVnaHQtZXhjZXB0aW9ucy1wb2xpY3k9dHJ1ZSB0byBoYW5kbGUgdGhvc2UgZXhjZXB0aW9ucyBwcm9wZXJseS4nLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgJ0RFUDAxNjgnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnZPYmplY3QudHJpZ2dlckZhdGFsRXhjZXB0aW9uKGVycik7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTm9kZUVudi5wcm90b3R5cGUuY2FsbEZpbmFsaXplciA9IGZ1bmN0aW9uIChjYiwgZGF0YSwgaGludCkge1xuICAgICAgICB0aGlzLmNhbGxGaW5hbGl6ZXJJbnRlcm5hbCgxLCBjYiwgZGF0YSwgaGludCk7XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5jYWxsRmluYWxpemVySW50ZXJuYWwgPSBmdW5jdGlvbiAoZm9yY2VVbmNhdWdodCwgY2IsIGRhdGEsIGhpbnQpIHtcbiAgICAgICAgdmFyIGYgPSB0aGlzLm1ha2VEeW5DYWxsX3ZwcHAoY2IpO1xuICAgICAgICB2YXIgZW52ID0gdGhpcy5pZDtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5jdHgub3BlblNjb3BlKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0ludG9Nb2R1bGUoQm9vbGVhbihmb3JjZVVuY2F1Z2h0KSwgZnVuY3Rpb24gKCkgeyBmKGVudiwgZGF0YSwgaGludCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5jdHguY2xvc2VTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE5vZGVFbnYucHJvdG90eXBlLmVucXVldWVGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZmluYWxpemVyKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZW5xdWV1ZUZpbmFsaXplci5jYWxsKHRoaXMsIGZpbmFsaXplcik7XG4gICAgICAgIGlmICghdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgJiYgIXRoaXMuZGVzdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemF0aW9uU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVmKCk7XG4gICAgICAgICAgICBfc2V0SW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5maW5hbGl6YXRpb25TY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBfdGhpcy51bnJlZigpO1xuICAgICAgICAgICAgICAgIF90aGlzLmRyYWluRmluYWxpemVyUXVldWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBOb2RlRW52LnByb3RvdHlwZS5kcmFpbkZpbmFsaXplclF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5wZW5kaW5nRmluYWxpemVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YXIgcmVmVHJhY2tlciA9IHRoaXMucGVuZGluZ0ZpbmFsaXplcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHJlZlRyYWNrZXIuZmluYWxpemUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE5vZGVFbnY7XG59KEVudikpO1xuZnVuY3Rpb24gbmV3RW52KGN0eCwgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpIHtcbiAgICBtb2R1bGVBcGlWZXJzaW9uID0gdHlwZW9mIG1vZHVsZUFwaVZlcnNpb24gIT09ICdudW1iZXInID8gTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT04gOiBtb2R1bGVBcGlWZXJzaW9uO1xuICAgIC8vIFZhbGlkYXRlIG1vZHVsZV9hcGlfdmVyc2lvbi5cbiAgICBpZiAobW9kdWxlQXBpVmVyc2lvbiA8IE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OKSB7XG4gICAgICAgIG1vZHVsZUFwaVZlcnNpb24gPSBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjtcbiAgICB9XG4gICAgZWxzZSBpZiAobW9kdWxlQXBpVmVyc2lvbiA+IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCAmJiBtb2R1bGVBcGlWZXJzaW9uICE9PSBOQVBJX1ZFUlNJT05fRVhQRVJJTUVOVEFMKSB7XG4gICAgICAgIHRocm93Tm9kZUFwaVZlcnNpb25FcnJvcihmaWxlbmFtZSwgbW9kdWxlQXBpVmVyc2lvbik7XG4gICAgfVxuICAgIHZhciBlbnYgPSBuZXcgTm9kZUVudihjdHgsIGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKTtcbiAgICBjdHguZW52U3RvcmUuYWRkKGVudik7XG4gICAgY3R4LmFkZENsZWFudXBIb29rKGVudiwgZnVuY3Rpb24gKCkgeyBlbnYudW5yZWYoKTsgfSwgMCk7XG4gICAgcmV0dXJuIGVudjtcbn1cblxudmFyIEVtbmFwaUVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhFbW5hcGlFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBFbW5hcGlFcnJvcihtZXNzYWdlKSB7XG4gICAgICAgIHZhciBfbmV3VGFyZ2V0ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgdmFyIEVycm9yQ29uc3RydWN0b3IgPSBfbmV3VGFyZ2V0O1xuICAgICAgICB2YXIgcHJvdG8gPSBFcnJvckNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICAgICAgaWYgKCEoX3RoaXMgaW5zdGFuY2VvZiBFbW5hcGlFcnJvcikpIHtcbiAgICAgICAgICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0UHJvdG90eXBlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBzZXRQcm90b3R5cGVPZi5jYWxsKE9iamVjdCwgX3RoaXMsIHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgICAgICAgICAgICAgIF90aGlzLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF90aGlzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBFbW5hcGlFcnJvcjtcbn0oRXJyb3IpKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbW5hcGlFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ0VtbmFwaUVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydFdlYWtSZWZFcnJvciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoTm90U3VwcG9ydFdlYWtSZWZFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJGaW5hbGl6YXRpb25SZWdpc3RyeVxcXCIgYW5kIFxcXCJXZWFrUmVmXFxcIi5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0V2Vha1JlZkVycm9yO1xufShFbW5hcGlFcnJvcikpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KE5vdFN1cHBvcnRXZWFrUmVmRXJyb3IucHJvdG90eXBlLCAnbmFtZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6ICdOb3RTdXBwb3J0V2Vha1JlZkVycm9yJ1xufSk7XG52YXIgTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhOb3RTdXBwb3J0QnVmZmVyRXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gTm90U3VwcG9ydEJ1ZmZlckVycm9yKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgXCJcIi5jb25jYXQoYXBpLCBcIjogVGhlIGN1cnJlbnQgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IFxcXCJCdWZmZXJcXFwiLiBDb25zaWRlciB1c2luZyBidWZmZXIgcG9seWZpbGwgdG8gbWFrZSBzdXJlIGBnbG9iYWxUaGlzLkJ1ZmZlcmAgaXMgZGVmaW5lZC5cIikuY29uY2F0KG1lc3NhZ2UgPyBcIiBcIi5jb25jYXQobWVzc2FnZSkgOiAnJykpIHx8IHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBOb3RTdXBwb3J0QnVmZmVyRXJyb3I7XG59KEVtbmFwaUVycm9yKSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTm90U3VwcG9ydEJ1ZmZlckVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnTm90U3VwcG9ydEJ1ZmZlckVycm9yJ1xufSk7XG5cbnZhciBTdHJvbmdSZWYgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3Ryb25nUmVmKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGVyZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9O1xuICAgIFN0cm9uZ1JlZi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICByZXR1cm4gU3Ryb25nUmVmO1xufSgpKTtcbnZhciBQZXJzaXN0ZW50ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBlcnNpc3RlbnQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcmVmID0gbmV3IFN0cm9uZ1JlZih2YWx1ZSk7XG4gICAgfVxuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLnNldFdlYWsgPSBmdW5jdGlvbiAocGFyYW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9yZWYgaW5zdGFuY2VvZiBXZWFrUmVmKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHZhbHVlLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgIHZhciB3ZWFrUmVmID0gbmV3IFdlYWtSZWYodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3JlZiA9IHdlYWtSZWY7XG4gICAgICAgICAgICB0aGlzLl9wYXJhbSA9IHBhcmFtO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3ltYm9sJykgO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50LnByb3RvdHlwZS5jbGVhcldlYWsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghc3VwcG9ydEZpbmFsaXplciB8fCB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX3JlZiBpbnN0YW5jZW9mIFdlYWtSZWYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgUGVyc2lzdGVudC5fcmVnaXN0cnkudW5yZWdpc3Rlcih0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgICAgIHRoaXMuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWYuZGVyZWYoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWYgPSBuZXcgU3Ryb25nUmVmKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUGVyc2lzdGVudC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzdXBwb3J0RmluYWxpemVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQuX3JlZ2lzdHJ5LnVucmVnaXN0ZXIodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5fcmVmIGluc3RhbmNlb2YgU3Ryb25nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWYuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZiA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWYgPT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFBlcnNpc3RlbnQucHJvdG90eXBlLmRlcmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcmVmID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmLmRlcmVmKCk7XG4gICAgfTtcbiAgICBQZXJzaXN0ZW50Ll9yZWdpc3RyeSA9IHN1cHBvcnRGaW5hbGl6ZXJcbiAgICAgICAgPyBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5fcmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gdmFsdWUuX2NhbGxiYWNrO1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gdmFsdWUuX3BhcmFtO1xuICAgICAgICAgICAgdmFsdWUuX2NhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFsdWUuX3BhcmFtID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhcmFtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIFBlcnNpc3RlbnQ7XG59KCkpO1xuXG52YXIgUmVmZXJlbmNlT3duZXJzaGlwO1xuKGZ1bmN0aW9uIChSZWZlcmVuY2VPd25lcnNoaXApIHtcbiAgICBSZWZlcmVuY2VPd25lcnNoaXBbUmVmZXJlbmNlT3duZXJzaGlwW1wia1J1bnRpbWVcIl0gPSAwXSA9IFwia1J1bnRpbWVcIjtcbiAgICBSZWZlcmVuY2VPd25lcnNoaXBbUmVmZXJlbmNlT3duZXJzaGlwW1wia1VzZXJsYW5kXCJdID0gMV0gPSBcImtVc2VybGFuZFwiO1xufSkoUmVmZXJlbmNlT3duZXJzaGlwIHx8IChSZWZlcmVuY2VPd25lcnNoaXAgPSB7fSkpO1xuZnVuY3Rpb24gY2FuQmVIZWxkV2Vha2x5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmlzT2JqZWN0KCkgfHwgdmFsdWUuaXNGdW5jdGlvbigpIHx8IHZhbHVlLmlzU3ltYm9sKCk7XG59XG52YXIgUmVmZXJlbmNlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhSZWZlcmVuY2UsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbnZPYmplY3QgPSBlbnZPYmplY3Q7XG4gICAgICAgIF90aGlzLl9yZWZjb3VudCA9IGluaXRpYWxSZWZjb3VudDtcbiAgICAgICAgX3RoaXMuX293bmVyc2hpcCA9IG93bmVyc2hpcDtcbiAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5jdHguaGFuZGxlU3RvcmUuZ2V0KGhhbmRsZV9pZCk7XG4gICAgICAgIF90aGlzLmNhbkJlV2VhayA9IGNhbkJlSGVsZFdlYWtseShoYW5kbGUpO1xuICAgICAgICBfdGhpcy5wZXJzaXN0ZW50ID0gbmV3IFBlcnNpc3RlbnQoaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgX3RoaXMuaWQgPSAwO1xuICAgICAgICBpZiAoaW5pdGlhbFJlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBfdGhpcy5fc2V0V2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmZXJlbmNlLndlYWtDYWxsYmFjayA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgcmVmLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgcmVmLmludm9rZUZpbmFsaXplckZyb21HQygpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIF91bnVzZWQxLCBfdW51c2VkMiwgX3VudXNlZDMpIHtcbiAgICAgICAgdmFyIHJlZiA9IG5ldyBSZWZlcmVuY2UoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwKTtcbiAgICAgICAgZW52T2JqZWN0LmN0eC5yZWZTdG9yZS5hZGQocmVmKTtcbiAgICAgICAgcmVmLmxpbmsoZW52T2JqZWN0LnJlZmxpc3QpO1xuICAgICAgICByZXR1cm4gcmVmO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RlbnQuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt0aGlzLl9yZWZjb3VudCA9PT0gMSAmJiB0aGlzLmNhbkJlV2Vhaykge1xuICAgICAgICAgICAgdGhpcy5wZXJzaXN0ZW50LmNsZWFyV2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlcnNpc3RlbnQuaXNFbXB0eSgpIHx8IHRoaXMuX3JlZmNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoLS10aGlzLl9yZWZjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fc2V0V2VhaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZjb3VudDtcbiAgICB9O1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICBpZiAoZW52T2JqZWN0ID09PSB2b2lkIDApIHsgZW52T2JqZWN0ID0gdGhpcy5lbnZPYmplY3Q7IH1cbiAgICAgICAgaWYgKHRoaXMucGVyc2lzdGVudC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmogPSB0aGlzLnBlcnNpc3RlbnQuZGVyZWYoKTtcbiAgICAgICAgdmFyIGhhbmRsZSA9IGVudk9iamVjdC5lbnN1cmVIYW5kbGUob2JqKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZS5pZDtcbiAgICB9O1xuICAgIC8qKiBAdmlydHVhbCAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVzZXRGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gMDsgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlZmNvdW50ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcmVmY291bnQ7IH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5vd25lcnNoaXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9vd25lcnNoaXA7IH07XG4gICAgLyoqIEB2aXJ0dWFsICovXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5jYWxsVXNlckZpbmFsaXplciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAvKiogQHZpcnR1YWwgKi9cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmludm9rZUZpbmFsaXplckZyb21HQyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZSgpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5fc2V0V2VhayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQmVXZWFrKSB7XG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RlbnQuc2V0V2Vhayh0aGlzLCBSZWZlcmVuY2Uud2Vha0NhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudC5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBlcnNpc3RlbnQucmVzZXQoKTtcbiAgICAgICAgdmFyIGRlbGV0ZU1lID0gdGhpcy5fb3duZXJzaGlwID09PSBSZWZlcmVuY2VPd25lcnNoaXAua1J1bnRpbWU7XG4gICAgICAgIHRoaXMudW5saW5rKCk7XG4gICAgICAgIHRoaXMuY2FsbFVzZXJGaW5hbGl6ZXIoKTtcbiAgICAgICAgaWYgKGRlbGV0ZU1lKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pZCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy51bmxpbmsoKTtcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW50LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZW52T2JqZWN0LmN0eC5yZWZTdG9yZS5yZW1vdmUodGhpcy5pZCk7XG4gICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgfTtcbiAgICByZXR1cm4gUmVmZXJlbmNlO1xufShSZWZUcmFja2VyKSk7XG52YXIgUmVmZXJlbmNlV2l0aERhdGEgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFJlZmVyZW5jZVdpdGhEYXRhLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIFJlZmVyZW5jZVdpdGhEYXRhKGVudk9iamVjdCwgdmFsdWUsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBfZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2RhdGEgPSBfZGF0YTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBSZWZlcmVuY2VXaXRoRGF0YS5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCB2YWx1ZSwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGRhdGEpIHtcbiAgICAgICAgdmFyIHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2VXaXRoRGF0YShlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZGF0YSk7XG4gICAgICAgIGVudk9iamVjdC5jdHgucmVmU3RvcmUuYWRkKHJlZmVyZW5jZSk7XG4gICAgICAgIHJlZmVyZW5jZS5saW5rKGVudk9iamVjdC5yZWZsaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhEYXRhLnByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRGF0YTtcbn0oUmVmZXJlbmNlKSk7XG52YXIgUmVmZXJlbmNlV2l0aEZpbmFsaXplciA9IC8qI19fUFVSRV9fKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoUmVmZXJlbmNlV2l0aEZpbmFsaXplciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBSZWZlcmVuY2VXaXRoRmluYWxpemVyKGVudk9iamVjdCwgdmFsdWUsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2ZpbmFsaXplciA9IG5ldyBGaW5hbGl6ZXIoZW52T2JqZWN0LCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5jcmVhdGUgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCB2YWx1ZSwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHZhciByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlV2l0aEZpbmFsaXplcihlbnZPYmplY3QsIHZhbHVlLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCwgZmluYWxpemVfY2FsbGJhY2ssIGZpbmFsaXplX2RhdGEsIGZpbmFsaXplX2hpbnQpO1xuICAgICAgICBlbnZPYmplY3QuY3R4LnJlZlN0b3JlLmFkZChyZWZlcmVuY2UpO1xuICAgICAgICByZWZlcmVuY2UubGluayhlbnZPYmplY3QuZmluYWxpemluZ19yZWZsaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIucHJvdG90eXBlLnJlc2V0RmluYWxpemVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9maW5hbGl6ZXIucmVzZXRGaW5hbGl6ZXIoKTtcbiAgICB9O1xuICAgIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIucHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5hbGl6ZXIuZGF0YSgpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5wcm90b3R5cGUuY2FsbFVzZXJGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5jYWxsRmluYWxpemVyKCk7XG4gICAgfTtcbiAgICBSZWZlcmVuY2VXaXRoRmluYWxpemVyLnByb3RvdHlwZS5pbnZva2VGaW5hbGl6ZXJGcm9tR0MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5lbnZPYmplY3QuaW52b2tlRmluYWxpemVyRnJvbUdDKHRoaXMpO1xuICAgIH07XG4gICAgUmVmZXJlbmNlV2l0aEZpbmFsaXplci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maW5hbGl6ZXIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplci5lbnZPYmplY3QuZGVxdWV1ZUZpbmFsaXplcih0aGlzKTtcbiAgICAgICAgdGhpcy5fZmluYWxpemVyLmRpc3Bvc2UoKTtcbiAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplciA9IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRmluYWxpemVyO1xufShSZWZlcmVuY2UpKTtcblxudmFyIERlZmVycmVkID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKGN0eCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMuY3R4ID0gY3R4O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIERlZmVycmVkLmNyZWF0ZSA9IGZ1bmN0aW9uIChjdHgsIHZhbHVlKSB7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZChjdHgsIHZhbHVlKTtcbiAgICAgICAgY3R4LmRlZmVycmVkU3RvcmUuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZS5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgfTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aGlzLnZhbHVlLnJlamVjdChyZWFzb24pO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICB9O1xuICAgIERlZmVycmVkLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmN0eC5kZWZlcnJlZFN0b3JlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgdGhpcy5pZCA9IDA7XG4gICAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmN0eCA9IG51bGw7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG52YXIgU3RvcmUgPSAvKiNfX1BVUkVfXyovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3RvcmUoKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gNDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDE7XG4gICAgICAgIHRoaXMuX2ZyZWVMaXN0ID0gW107XG4gICAgfVxuICAgIFN0b3JlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGlkO1xuICAgICAgICBpZiAodGhpcy5fZnJlZUxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMuX2ZyZWVMaXN0LnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMuX3NpemU7XG4gICAgICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgICAgICB2YXIgY2FwYWNpdHkgPSB0aGlzLl92YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlkID49IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IGNhcGFjaXR5ICsgKGNhcGFjaXR5ID4+IDEpICsgMTY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5fdmFsdWVzW2lkXSA9IHZhbHVlO1xuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICB9O1xuICAgIFN0b3JlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1tpZF0gIT09IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIFN0b3JlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fdmFsdWVzW2lkXTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZS5pZCA9IDA7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fZnJlZUxpc3QucHVzaChOdW1iZXIoaWQpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3RvcmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5fc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IFt1bmRlZmluZWRdO1xuICAgICAgICB0aGlzLl9zaXplID0gMTtcbiAgICAgICAgdGhpcy5fZnJlZUxpc3QgPSBbXTtcbiAgICB9O1xuICAgIHJldHVybiBTdG9yZTtcbn0oKSk7XG5cbnZhciBDbGVhbnVwSG9va0NhbGxiYWNrID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsZWFudXBIb29rQ2FsbGJhY2soZW52T2JqZWN0LCBmbiwgYXJnLCBvcmRlcikge1xuICAgICAgICB0aGlzLmVudk9iamVjdCA9IGVudk9iamVjdDtcbiAgICAgICAgdGhpcy5mbiA9IGZuO1xuICAgICAgICB0aGlzLmFyZyA9IGFyZztcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgIH1cbiAgICByZXR1cm4gQ2xlYW51cEhvb2tDYWxsYmFjaztcbn0oKSk7XG52YXIgQ2xlYW51cFF1ZXVlID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENsZWFudXBRdWV1ZSgpIHtcbiAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzID0gW107XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rQ291bnRlciA9IDA7XG4gICAgfVxuICAgIENsZWFudXBRdWV1ZS5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGVhbnVwSG9va3MubGVuZ3RoID09PSAwO1xuICAgIH07XG4gICAgQ2xlYW51cFF1ZXVlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIGlmICh0aGlzLl9jbGVhbnVwSG9va3MuZmlsdGVyKGZ1bmN0aW9uIChob29rKSB7IHJldHVybiAoaG9vay5lbnZPYmplY3QgPT09IGVudk9iamVjdCAmJiBob29rLmZuID09PSBmbiAmJiBob29rLmFyZyA9PT0gYXJnKTsgfSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGFkZCBzYW1lIGZuIGFuZCBhcmcgdHdpY2UnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va3MucHVzaChuZXcgQ2xlYW51cEhvb2tDYWxsYmFjayhlbnZPYmplY3QsIGZuLCBhcmcsIHRoaXMuX2NsZWFudXBIb29rQ291bnRlcisrKSk7XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZuLCBhcmcpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9jbGVhbnVwSG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBob29rID0gdGhpcy5fY2xlYW51cEhvb2tzW2ldO1xuICAgICAgICAgICAgaWYgKGhvb2suZW52T2JqZWN0ID09PSBlbnZPYmplY3QgJiYgaG9vay5mbiA9PT0gZm4gJiYgaG9vay5hcmcgPT09IGFyZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaG9va3MgPSB0aGlzLl9jbGVhbnVwSG9va3Muc2xpY2UoKTtcbiAgICAgICAgaG9va3Muc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gKGIub3JkZXIgLSBhLm9yZGVyKTsgfSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjYiA9IGhvb2tzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYi5mbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjYi5lbnZPYmplY3QubWFrZUR5bkNhbGxfdnAoY2IuZm4pKGNiLmFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYi5mbihjYi5hcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2xlYW51cEhvb2tzLnNwbGljZSh0aGlzLl9jbGVhbnVwSG9va3MuaW5kZXhPZihjYiksIDEpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDbGVhbnVwUXVldWUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBIb29rcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9jbGVhbnVwSG9va0NvdW50ZXIgPSAwO1xuICAgIH07XG4gICAgcmV0dXJuIENsZWFudXBRdWV1ZTtcbn0oKSk7XG52YXIgTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlcigpIHtcbiAgICAgICAgdGhpcy5yZWZIYW5kbGUgPSBuZXcgX01lc3NhZ2VDaGFubmVsKCkucG9ydDE7XG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xuICAgIH1cbiAgICBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIucHJvdG90eXBlLmluY3JlYXNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmSGFuZGxlLnJlZikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmSGFuZGxlLnJlZigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY291bnQrKztcbiAgICB9O1xuICAgIE5vZGVqc1dhaXRpbmdSZXF1ZXN0Q291bnRlci5wcm90b3R5cGUuZGVjcmVhc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmSGFuZGxlLnVucmVmKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZIYW5kbGUudW5yZWYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvdW50LS07XG4gICAgfTtcbiAgICByZXR1cm4gTm9kZWpzV2FpdGluZ1JlcXVlc3RDb3VudGVyO1xufSgpKTtcbnZhciBDb250ZXh0ID0gLyojX19QVVJFX18qLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnRleHQoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2lzU3RvcHBpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2FuQ2FsbEludG9KcyA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N1cHByZXNzRGVzdHJveSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVudlN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuc2NvcGVTdG9yZSA9IG5ldyBTY29wZVN0b3JlKCk7XG4gICAgICAgIHRoaXMucmVmU3RvcmUgPSBuZXcgU3RvcmUoKTtcbiAgICAgICAgdGhpcy5kZWZlcnJlZFN0b3JlID0gbmV3IFN0b3JlKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlU3RvcmUgPSBuZXcgSGFuZGxlU3RvcmUoKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlID0ge1xuICAgICAgICAgICAgc3VwcG9ydFJlZmxlY3Q6IHN1cHBvcnRSZWZsZWN0LFxuICAgICAgICAgICAgc3VwcG9ydEZpbmFsaXplcjogc3VwcG9ydEZpbmFsaXplcixcbiAgICAgICAgICAgIHN1cHBvcnRXZWFrU3ltYm9sOiBzdXBwb3J0V2Vha1N5bWJvbCxcbiAgICAgICAgICAgIHN1cHBvcnRCaWdJbnQ6IHN1cHBvcnRCaWdJbnQsXG4gICAgICAgICAgICBzdXBwb3J0TmV3RnVuY3Rpb246IHN1cHBvcnROZXdGdW5jdGlvbixcbiAgICAgICAgICAgIGNhblNldEZ1bmN0aW9uTmFtZTogY2FuU2V0RnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlOiBfc2V0SW1tZWRpYXRlLFxuICAgICAgICAgICAgQnVmZmVyOiBfQnVmZmVyLFxuICAgICAgICAgICAgTWVzc2FnZUNoYW5uZWw6IF9NZXNzYWdlQ2hhbm5lbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZSA9IG5ldyBDbGVhbnVwUXVldWUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzLm9uY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucmVmQ291bnRlciA9IG5ldyBOb2RlanNXYWl0aW5nUmVxdWVzdENvdW50ZXIoKTtcbiAgICAgICAgICAgIHByb2Nlc3Mub25jZSgnYmVmb3JlRXhpdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLl9zdXBwcmVzc0Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN1cHByZXNzIHRoZSBkZXN0cm95IG9uIGBiZWZvcmVFeGl0YCBldmVudCBpbiBOb2RlLmpzLlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgY29udGV4dCBhbmRcbiAgICAgKiBhbGwgYXNzb2NpYXRlZCB7QGxpbmsgRW52IHwgRW52fSBhbGl2ZSxcbiAgICAgKiB0aGlzIGFsc28gbWVhbnMgdGhhdCBjbGVhbnVwIGhvb2tzIHdpbGwgbm90IGJlIGNhbGxlZC5cbiAgICAgKiBBZnRlciBjYWxsIHRoaXMgbWV0aG9kLCB5b3Ugc2hvdWxkIGNhbGxcbiAgICAgKiB7QGxpbmsgQ29udGV4dC5kZXN0cm95IHwgYENvbnRleHQucHJvdG90eXBlLmRlc3Ryb3lgfSBtZXRob2QgbWFudWFsbHkuXG4gICAgICovXG4gICAgQ29udGV4dC5wcm90b3R5cGUuc3VwcHJlc3NEZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zdXBwcmVzc0Rlc3Ryb3kgPSB0cnVlO1xuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZVxuICAgIENvbnRleHQucHJvdG90eXBlLmdldFJ1bnRpbWVWZXJzaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgICBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVg6IE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01BWCxcbiAgICAgICAgICAgIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUw6IE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsXG4gICAgICAgICAgICBOT0RFX0FQSV9ERUZBVUxUX01PRFVMRV9BUElfVkVSU0lPTjogTk9ERV9BUElfREVGQVVMVF9NT0RVTEVfQVBJX1ZFUlNJT05cbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZU5vdFN1cHBvcnRXZWFrUmVmRXJyb3IgPSBmdW5jdGlvbiAoYXBpLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90U3VwcG9ydFdlYWtSZWZFcnJvcihhcGksIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlTm90U3VwcG9ydEJ1ZmZlckVycm9yID0gZnVuY3Rpb24gKGFwaSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IE5vdFN1cHBvcnRCdWZmZXJFcnJvcihhcGksIG1lc3NhZ2UpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUmVmZXJlbmNlID0gZnVuY3Rpb24gKGVudk9iamVjdCwgaGFuZGxlX2lkLCBpbml0aWFsUmVmY291bnQsIG93bmVyc2hpcCkge1xuICAgICAgICByZXR1cm4gUmVmZXJlbmNlLmNyZWF0ZShlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXApO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlUmVmZXJlbmNlV2l0aERhdGEgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRGF0YS5jcmVhdGUoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBkYXRhKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZVJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBoYW5kbGVfaWQsIGluaXRpYWxSZWZjb3VudCwgb3duZXJzaGlwLCBmaW5hbGl6ZV9jYWxsYmFjaywgZmluYWxpemVfZGF0YSwgZmluYWxpemVfaGludCkge1xuICAgICAgICBpZiAoZmluYWxpemVfY2FsbGJhY2sgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9jYWxsYmFjayA9IDA7IH1cbiAgICAgICAgaWYgKGZpbmFsaXplX2RhdGEgPT09IHZvaWQgMCkgeyBmaW5hbGl6ZV9kYXRhID0gMDsgfVxuICAgICAgICBpZiAoZmluYWxpemVfaGludCA9PT0gdm9pZCAwKSB7IGZpbmFsaXplX2hpbnQgPSAwOyB9XG4gICAgICAgIHJldHVybiBSZWZlcmVuY2VXaXRoRmluYWxpemVyLmNyZWF0ZShlbnZPYmplY3QsIGhhbmRsZV9pZCwgaW5pdGlhbFJlZmNvdW50LCBvd25lcnNoaXAsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmNyZWF0ZURlZmVycmVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBEZWZlcnJlZC5jcmVhdGUodGhpcywgdmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRW52ID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBtb2R1bGVBcGlWZXJzaW9uLCBtYWtlRHluQ2FsbF92cHBwLCBtYWtlRHluQ2FsbF92cCwgYWJvcnQsIG5vZGVCaW5kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXdFbnYodGhpcywgZmlsZW5hbWUsIG1vZHVsZUFwaVZlcnNpb24sIG1ha2VEeW5DYWxsX3ZwcHAsIG1ha2VEeW5DYWxsX3ZwLCBhYm9ydCwgbm9kZUJpbmRpbmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlVHJhY2tlZEZpbmFsaXplciA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KSB7XG4gICAgICAgIHJldHVybiBUcmFja2VkRmluYWxpemVyLmNyZWF0ZShlbnZPYmplY3QsIGZpbmFsaXplX2NhbGxiYWNrLCBmaW5hbGl6ZV9kYXRhLCBmaW5hbGl6ZV9oaW50KTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLmdldEN1cnJlbnRTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVTdG9yZS5jdXJyZW50U2NvcGU7XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5hZGRUb0N1cnJlbnRTY29wZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZVN0b3JlLmN1cnJlbnRTY29wZS5hZGQodmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUub3BlblNjb3BlID0gZnVuY3Rpb24gKGVudk9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZVN0b3JlLm9wZW5TY29wZShlbnZPYmplY3QpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY2xvc2VTY29wZSA9IGZ1bmN0aW9uIChlbnZPYmplY3QsIF9zY29wZSkge1xuICAgICAgICB0aGlzLnNjb3BlU3RvcmUuY2xvc2VTY29wZShlbnZPYmplY3QpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZW5zdXJlSGFuZGxlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOiByZXR1cm4gSGFuZGxlU3RvcmUuVU5ERUZJTkVEO1xuICAgICAgICAgICAgY2FzZSBudWxsOiByZXR1cm4gSGFuZGxlU3RvcmUuTlVMTDtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTogcmV0dXJuIEhhbmRsZVN0b3JlLlRSVUU7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOiByZXR1cm4gSGFuZGxlU3RvcmUuRkFMU0U7XG4gICAgICAgICAgICBjYXNlIF9nbG9iYWw6IHJldHVybiBIYW5kbGVTdG9yZS5HTE9CQUw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkVG9DdXJyZW50U2NvcGUodmFsdWUpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuYWRkQ2xlYW51cEhvb2sgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlLmFkZChlbnZPYmplY3QsIGZuLCBhcmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUucmVtb3ZlQ2xlYW51cEhvb2sgPSBmdW5jdGlvbiAoZW52T2JqZWN0LCBmbiwgYXJnKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cFF1ZXVlLnJlbW92ZShlbnZPYmplY3QsIGZuLCBhcmcpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUucnVuQ2xlYW51cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKCF0aGlzLmNsZWFudXBRdWV1ZS5lbXB0eSgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBRdWV1ZS5kcmFpbigpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb250ZXh0LnByb3RvdHlwZS5pbmNyZWFzZVdhaXRpbmdSZXF1ZXN0Q291bnRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnJlZkNvdW50ZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbmNyZWFzZSgpO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuZGVjcmVhc2VXYWl0aW5nUmVxdWVzdENvdW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5yZWZDb3VudGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVjcmVhc2UoKTtcbiAgICB9O1xuICAgIENvbnRleHQucHJvdG90eXBlLnNldENhbkNhbGxJbnRvSnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fY2FuQ2FsbEludG9KcyA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuc2V0U3RvcHBpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faXNTdG9wcGluZyA9IHZhbHVlO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuY2FuQ2FsbEludG9KcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkNhbGxJbnRvSnMgJiYgIXRoaXMuX2lzU3RvcHBpbmc7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb250ZXh0IGFuZCBjYWxsIGNsZWFudXAgaG9va3MuXG4gICAgICogQXNzb2NpYXRlZCB7QGxpbmsgRW52IHwgRW52fSB3aWxsIGJlIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBDb250ZXh0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNldFN0b3BwaW5nKHRydWUpO1xuICAgICAgICB0aGlzLnNldENhbkNhbGxJbnRvSnMoZmFsc2UpO1xuICAgICAgICB0aGlzLnJ1bkNsZWFudXAoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb250ZXh0O1xufSgpKTtcbnZhciBkZWZhdWx0Q29udGV4dDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoKSB7XG4gICAgcmV0dXJuIG5ldyBDb250ZXh0KCk7XG59XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpIHtcbiAgICBpZiAoIWRlZmF1bHRDb250ZXh0KSB7XG4gICAgICAgIGRlZmF1bHRDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdENvbnRleHQ7XG59XG5cbmV4cG9ydCB7IENvbnN0SGFuZGxlLCBDb250ZXh0LCBEZWZlcnJlZCwgRW1uYXBpRXJyb3IsIEVudiwgRXh0ZXJuYWwsIEZpbmFsaXplciwgSGFuZGxlLCBIYW5kbGVTY29wZSwgSGFuZGxlU3RvcmUsIE5BUElfVkVSU0lPTl9FWFBFUklNRU5UQUwsIE5PREVfQVBJX0RFRkFVTFRfTU9EVUxFX0FQSV9WRVJTSU9OLCBOT0RFX0FQSV9TVVBQT1JURURfVkVSU0lPTl9NQVgsIE5PREVfQVBJX1NVUFBPUlRFRF9WRVJTSU9OX01JTiwgTm9kZUVudiwgTm90U3VwcG9ydEJ1ZmZlckVycm9yLCBOb3RTdXBwb3J0V2Vha1JlZkVycm9yLCBQZXJzaXN0ZW50LCBSZWZUcmFja2VyLCBSZWZlcmVuY2UsIFJlZmVyZW5jZU93bmVyc2hpcCwgUmVmZXJlbmNlV2l0aERhdGEsIFJlZmVyZW5jZVdpdGhGaW5hbGl6ZXIsIFNjb3BlU3RvcmUsIFN0b3JlLCBUcmFja2VkRmluYWxpemVyLCBUcnlDYXRjaCwgY3JlYXRlQ29udGV4dCwgZ2V0RGVmYXVsdENvbnRleHQsIGdldEV4dGVybmFsVmFsdWUsIGlzRXh0ZXJuYWwsIGlzUmVmZXJlbmNlVHlwZSwgdmVyc2lvbiB9O1xuIiwiY29uc3QgX1dlYkFzc2VtYmx5ID0gdHlwZW9mIFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgID8gV2ViQXNzZW1ibHlcbiAgICA6IHR5cGVvZiBXWFdlYkFzc2VtYmx5ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/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+IHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAwOlxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKVxuICAgIGNhc2UgMjoge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBJbnQzMkFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWUgPyAxIDogMFxuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHZpZXcuYnVmZmVyKVxuICAgIH1cbiAgICBjYXNlIDM6IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDEpXG4gICAgICB2aWV3WzBdID0gdmFsdWVcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh2aWV3LmJ1ZmZlcilcbiAgICB9XG4gICAgY2FzZSA0OiB7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKVxuICAgICAgcmV0dXJuIHZpZXdcbiAgICB9XG4gICAgY2FzZSA2OiB7XG4gICAgICBjb25zdCBbZW50cnldID0gT2JqZWN0LmVudHJpZXMobWVtZnMpLmZpbHRlcigoW18sIHZdKSA9PiB2ID09PSB2YWx1ZS5jb25zdHJ1Y3RvcilbMF0gPz8gW11cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWUsICdfX2NvbnN0cnVjdG9yX18nLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGVudHJ5XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIGBCaWdJbnQoJHtTdHJpbmcodmFsdWUpfSlgXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgICAgICAgX19lcnJvcl9fOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH0pXG4gICAgICBjb25zdCB2aWV3ID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pXG4gICAgICByZXR1cm4gdmlld1xuICAgIH1cbiAgICBjYXNlIDk6IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgQmlnSW50NjRBcnJheSgxKVxuICAgICAgdmlld1swXSA9IHZhbHVlXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodmlldy5idWZmZXIpXG4gICAgfVxuICAgIGNhc2UgLTE6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgZGF0YScpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoJ21lbWZzJyl9IG1lbWZzXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHBheWxvYWRcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5jb25zdCBkZWNvZGVWYWx1ZSA9IChtZW1mcywgcGF5bG9hZCwgdHlwZSkgPT4ge1xuICBpZiAodHlwZSA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZSA9PT0gMSkgcmV0dXJuIG51bGxcbiAgaWYgKHR5cGUgPT09IDIpIHJldHVybiBCb29sZWFuKG5ldyBJbnQzMkFycmF5KHBheWxvYWQuYnVmZmVyLCBwYXlsb2FkLmJ5dGVPZmZzZXQsIDEpWzBdKVxuICBpZiAodHlwZSA9PT0gMykgcmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkocGF5bG9hZC5idWZmZXIsIHBheWxvYWQuYnl0ZU9mZnNldCwgMSlbMF1cbiAgaWYgKHR5cGUgPT09IDQpIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZC5zbGljZSgpKVxuICBpZiAodHlwZSA9PT0gNikge1xuICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQuc2xpY2UoKSksIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHZhbHVlLm1hdGNoKC9eQmlnSW50XFwoKC0/XFxkKylcXCkkLylcbiAgICAgICAgaWYgKG1hdGNoZWQgJiYgbWF0Y2hlZFsxXSkge1xuICAgICAgICAgIHJldHVybiBCaWdJbnQobWF0Y2hlZFsxXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSlcbiAgICBpZiAob2JqLl9fY29uc3RydWN0b3JfXykge1xuICAgICAgY29uc3QgY3RvciA9IG9iai5fX2NvbnN0cnVjdG9yX19cbiAgICAgIGRlbGV0ZSBvYmouX19jb25zdHJ1Y3Rvcl9fXG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yob2JqLCBtZW1mc1tjdG9yXS5wcm90b3R5cGUpXG4gICAgfVxuICAgIGlmIChvYmouX19lcnJvcl9fKSB7XG4gICAgICBjb25zdCBuYW1lID0gb2JqLl9fZXJyb3JfX1xuICAgICAgY29uc3QgRXJyb3JDb25zdHJ1Y3RvciA9IGdsb2JhbFRoaXNbbmFtZV0gfHwgRXJyb3JcbiAgICAgIGRlbGV0ZSBvYmouX19lcnJvcl9fXG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3JDb25zdHJ1Y3RvcihvYmoubWVzc2FnZSlcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdzdGFjaycsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBlcnIuc3RhY2tcbiAgICAgIH0pXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBuYW1lXG4gICAgICB9KVxuICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBpZiAoayA9PT0gJ21lc3NhZ2UnIHx8IGsgPT09ICdzdGFjaycpIGNvbnRpbnVlXG4gICAgICAgIGVycltrXSA9IHZcbiAgICAgIH1cbiAgICAgIHJldHVybiBlcnJcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG4gIGlmICh0eXBlID09PSA5KSByZXR1cm4gbmV3IEJpZ0ludDY0QXJyYXkocGF5bG9hZC5idWZmZXIsIHBheWxvYWQuYnl0ZU9mZnNldCwgMSlbMF1cbiAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBkYXRhJylcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnbWVtZnMnKS5JRnN9IGZzXG4gKiBAcmV0dXJucyB7KGU6IHsgZGF0YTogeyBfX2ZzX186IHsgc2FiOiBJbnQzMkFycmF5LCB0eXBlOiBrZXlvZiBpbXBvcnQoJ21lbWZzJykuSUZzLCBwYXlsb2FkOiBhbnlbXSB9IH0gfSkgPT4gdm9pZH1cbiAqL1xuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzIC0tIGZpeGVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZU9uTWVzc2FnZSA9IChmcykgPT4gZnVuY3Rpb24gb25NZXNzYWdlKGUpIHtcbiAgaWYgKGUuZGF0YS5fX2ZzX18pIHtcbiAgICAvKipcbiAgICAgKiAwLi40ICAgICAgICAgICAgICAgICAgICBzdGF0dXMoaW50MzJfdCk6ICAgICAgICAyMSh3YWl0aW5nKSAwKHN1Y2Nlc3MpIDEoZXJyb3IpXG4gICAgICogNS4uOCAgICAgICAgICAgICAgICAgICAgdHlwZShuYXBpX3ZhbHVldHlwZSk6ICAgMCh1bmRlZmluZWQpIDEobnVsbCkgMihib29sZWFuKSAzKG51bWJlcikgNChzdHJpbmcpIDYoanNvbnN0cmluZykgOShiaWdpbnQpIC0xKHVuc3VwcG9ydGVkKVxuICAgICAqIDkuLjE2ICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSh1aW50MzJfdCkgIDw9IDEwMjRcbiAgICAgKiAxNi4uMTYgKyBwYXlsb2FkX3NpemUgICBwYXlsb2FkX2NvbnRlbnRcbiAgICAgKi9cbiAgICBjb25zdCB7IHNhYiwgdHlwZSwgcGF5bG9hZCB9ID0gZS5kYXRhLl9fZnNfX1xuICAgIGNvbnN0IGZuID0gZnNbdHlwZV1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4uYXBwbHkoZnMsIHBheWxvYWQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMCwgMClcbiAgICAgIGNvbnN0IHQgPSBnZXRUeXBlKHJldClcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAxLCB0KVxuICAgICAgY29uc3QgdiA9IGVuY29kZVZhbHVlKGZzLCByZXQsIHQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMiwgdi5sZW5ndGgpXG4gICAgICBuZXcgVWludDhBcnJheShzYWIuYnVmZmVyKS5zZXQodiwgMTYpXG5cbiAgICB9IGNhdGNoICgvKiogQHR5cGUge2FueX0gKi8gZXJyKSB7XG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMCwgMSlcbiAgICAgIGNvbnN0IHQgPSBnZXRUeXBlKGVycilcbiAgICAgIEF0b21pY3Muc3RvcmUoc2FiLCAxLCB0KVxuICAgICAgY29uc3QgdiA9IGVuY29kZVZhbHVlKGZzLCBlcnIsIHQpXG4gICAgICBBdG9taWNzLnN0b3JlKHNhYiwgMiwgdi5sZW5ndGgpXG4gICAgICBuZXcgVWludDhBcnJheShzYWIuYnVmZmVyKS5zZXQodiwgMTYpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIEF0b21pY3Mubm90aWZ5KHNhYiwgMClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoJ21lbWZzJyl9IG1lbWZzXG4gKi9cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZUZzUHJveHkgPSAobWVtZnMpID0+IG5ldyBQcm94eSh7fSwge1xuICBnZXQgKF90YXJnZXQsIHAsIF9yZWNlaXZlcikge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IHNhYiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcigxNiArIDEwMjQwKVxuICAgICAgY29uc3QgaTMyYXJyID0gbmV3IEludDMyQXJyYXkoc2FiKVxuICAgICAgQXRvbWljcy5zdG9yZShpMzJhcnIsIDAsIDIxKVxuXG4gICAgICBwb3N0TWVzc2FnZSh7XG4gICAgICAgIF9fZnNfXzoge1xuICAgICAgICAgIHNhYjogaTMyYXJyLFxuICAgICAgICAgIHR5cGU6IHAsXG4gICAgICAgICAgcGF5bG9hZDogYXJnc1xuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBBdG9taWNzLndhaXQoaTMyYXJyLCAwLCAyMSlcblxuICAgICAgY29uc3Qgc3RhdHVzID0gQXRvbWljcy5sb2FkKGkzMmFyciwgMClcbiAgICAgIGNvbnN0IHR5cGUgPSBBdG9taWNzLmxvYWQoaTMyYXJyLCAxKVxuICAgICAgY29uc3Qgc2l6ZSA9IEF0b21pY3MubG9hZChpMzJhcnIsIDIpXG4gICAgICBjb25zdCBjb250ZW50ID0gbmV3IFVpbnQ4QXJyYXkoc2FiLCAxNiwgc2l6ZSlcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2RlVmFsdWUobWVtZnMsIGNvbnRlbnQsIHR5cGUpXG4gICAgICBpZiAoc3RhdHVzID09PSAxKSB7XG4gICAgICAgIHRocm93IHZhbHVlXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cbn0pXG4iXSwibmFtZXMiOlsiX1dlYkFzc2VtYmx5Iiwic2V0dXBJbnN0YW5jZSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsY0FBWSxHQUFHLE9BQU8sV0FBVyxLQUFLO0FBQzFDLE1BQU07QUFDTixNQUFNLE9BQU8sYUFBYSxLQUFLO0FBQy9CLFVBQVU7QUFDVixVQUFVLFNBQVM7QUFDbkIsSUFBSSxtQkFBbUIsR0FBa0MsSUFBTyxLQUFLLElBRXhCO0FBQzdDLFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRTtBQUNqQyxJQUFJLE9BQU8sUUFBUSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSztBQUM5RixVQUFVLE9BQU8sQ0FBQztBQUNsQixVQUFVLE9BQU8sV0FBVyxLQUFLO0FBQ2pDLGNBQWM7QUFDZCxjQUFjLFNBQVM7QUFDdkI7QUFDQSxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQy9DLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDO0FBQ3RD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QUFLLEdBQUcsS0FBSztBQUMxQjtBQUNBLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsWUFBWTtBQUN4QyxRQUFRLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUMzQyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtBQUM3QyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtBQUM3QyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtBQUM3QyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxZQUFZO0FBQzlDLFFBQVEsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVTtBQUMvQyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxZQUFZO0FBQzlDLFFBQVEsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNyQyxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzVDLFFBQVEsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtBQUNwRSxLQUFLO0FBQ0wsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQzNDLFFBQVEsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDeEMsS0FBSztBQUNMLElBQUksTUFBTSxDQUFDLFNB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QVksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDO0FBQzlDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDL0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7QUFDakQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7QUFDaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDO0FBQ3JFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNyRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDckU7QUFDQSxNQUFNLG1CQUFtQixDQUFDO0FBQzFCLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRTtBQUN6QixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNyQixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUk7QUFDaEMsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FB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QUFDLEVBQUUsQ0FBQztPQUN2QixNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO09BQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUNwQyxPQUFNLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsTUFBSyxTQUFTO0FBQ2QsT0FBTSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUE0QixPQUFBLENBQUEsYUFBQSxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRTtHQUN0RCxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFJLE9BQU8sVUFBVSxHQUFHLElBQUksRUFBRTtPQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxLQUFLO0FBQ2xELE9BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsR0FBRztPQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7QUFFakMsT0FBTSxXQUFXLENBQUM7QUFDbEIsU0FBUSxNQUFNLEVBQUU7V0FDTixHQUFHLEVBQUUsTUFBTTtXQUNYLElBQUksRUFBRSxDQUFDO0FBQ2pCLFdBQVUsT0FBTyxFQUFFO0FBQ25CO1FBQ087O09BRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O09BRTFCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7T0FDckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztPQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO09BQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSTtPQUM1QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJO0FBQ3BELE9BQU0sSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3hCLFNBQVEsTUFBTTtBQUNkO0FBQ0EsT0FBTSxPQUFPO0FBQ2I7QUFDQTtFQUNDOzs7Ozs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDRdfQ==