@zsviczian/excalidraw 0.9.0-obsidian-image-support-3 → 0.9.0-obsidian-image-support-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,334 @@
1
+ /*
2
+ * ATTENTION: An "eval-source-map" devtool has been used.
3
+ * This devtool is neither made for production nor for readable output files.
4
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
5
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6
+ * or disable the default devtool with "devtool: false".
7
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8
+ */
9
+ (globalThis["webpackChunkExcalidraw"] = globalThis["webpackChunkExcalidraw"] || []).push([["vendor"],{
10
+
11
+ /***/ "../../../node_modules/crc-32/crc32.js":
12
+ /*!*********************************************!*\
13
+ !*** ../../../node_modules/crc-32/crc32.js ***!
14
+ \*********************************************/
15
+ /***/ ((__unused_webpack_module, exports) => {
16
+
17
+ eval("/* crc32.js (C) 2014-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\nvar CRC32;\n(function (factory) {\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif(true) {\n\t\t\tfactory(exports);\n\t\t} else {}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n}(function(CRC32) {\nCRC32.version = '0.3.0';\n/* see perf/crc32table.js */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar table = signed_crc_table();\n/* charCodeAt is the best approach for binary strings */\nvar use_buffer = typeof Buffer !== 'undefined';\nfunction crc32_bstr(bstr) {\n\tif(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));\n\tvar crc = -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tcrc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t\tcrc = table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t}\n\tif(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf(buf) {\n\tif(buf.length > 10000) return crc32_buf_8(buf);\n\tfor(var crc = -1, i = 0, L=buf.length-3; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf_8(buf) {\n\tfor(var crc = -1, i = 0, L=buf.length-7; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\n/* much much faster to intertwine utf8 and crc */\nfunction crc32_str(str) {\n\tfor(var crc = -1, i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++) & 1023;\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];\n\t\t} else {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t}\n\t}\n\treturn crc ^ -1;\n}\nCRC32.table = table;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2NyYy0zMi9jcmMzMi5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxJQUEyQjtBQUNoQztBQUNBLElBQUksS0FBSyxFQVFOO0FBQ0gsR0FBRztBQUNILG9CQUFvQjtBQUNwQjtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLE1BQU07QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQyxNQUFNO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsOENBQThDLE1BQU07QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0osb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jcmMtMzIvY3JjMzIuanM/YjU4MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBjcmMzMi5qcyAoQykgMjAxNC0yMDE1IFNoZWV0SlMgLS0gaHR0cDovL3NoZWV0anMuY29tICovXG4vKiB2aW06IHNldCB0cz0yOiAqL1xudmFyIENSQzMyO1xuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBET19OT1RfRVhQT1JUX0NSQyA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRpZignb2JqZWN0JyA9PT0gdHlwZW9mIGV4cG9ydHMpIHtcblx0XHRcdGZhY3RvcnkoZXhwb3J0cyk7XG5cdFx0fSBlbHNlIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQpIHtcblx0XHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHZhciBtb2R1bGUgPSB7fTtcblx0XHRcdFx0ZmFjdG9yeShtb2R1bGUpO1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHQgIGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoQ1JDMzIgPSB7fSk7XG5cdH1cbn0oZnVuY3Rpb24oQ1JDMzIpIHtcbkNSQzMyLnZlcnNpb24gPSAnMC4zLjAnO1xuLyogc2VlIHBlcmYvY3JjMzJ0YWJsZS5qcyAqL1xuZnVuY3Rpb24gc2lnbmVkX2NyY190YWJsZSgpIHtcblx0dmFyIGMgPSAwLCB0YWJsZSA9IG5ldyBBcnJheSgyNTYpO1xuXG5cdGZvcih2YXIgbiA9MDsgbiAhPSAyNTY7ICsrbil7XG5cdFx0YyA9IG47XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0YyA9ICgoYyYxKSA/ICgtMzA2Njc0OTEyIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG5cdFx0dGFibGVbbl0gPSBjO1xuXHR9XG5cblx0cmV0dXJuIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IG5ldyBJbnQzMkFycmF5KHRhYmxlKSA6IHRhYmxlO1xufVxuXG52YXIgdGFibGUgPSBzaWduZWRfY3JjX3RhYmxlKCk7XG4vKiBjaGFyQ29kZUF0IGlzIHRoZSBiZXN0IGFwcHJvYWNoIGZvciBiaW5hcnkgc3RyaW5ncyAqL1xudmFyIHVzZV9idWZmZXIgPSB0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGNyYzMyX2JzdHIoYnN0cikge1xuXHRpZihic3RyLmxlbmd0aCA+IDMyNzY4KSBpZih1c2VfYnVmZmVyKSByZXR1cm4gY3JjMzJfYnVmXzgobmV3IEJ1ZmZlcihic3RyKSk7XG5cdHZhciBjcmMgPSAtMSwgTCA9IGJzdHIubGVuZ3RoIC0gMTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IEw7KSB7XG5cdFx0Y3JjID0gIHRhYmxlWyhjcmMgXiBic3RyLmNoYXJDb2RlQXQoaSsrKSkgJiAweEZGXSBeIChjcmMgPj4+IDgpO1xuXHRcdGNyYyA9ICB0YWJsZVsoY3JjIF4gYnN0ci5jaGFyQ29kZUF0KGkrKykpICYgMHhGRl0gXiAoY3JjID4+PiA4KTtcblx0fVxuXHRpZihpID09PSBMKSBjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBic3RyLmNoYXJDb2RlQXQoaSkpICYgMHhGRl07XG5cdHJldHVybiBjcmMgXiAtMTtcbn1cblxuZnVuY3Rpb24gY3JjMzJfYnVmKGJ1Zikge1xuXHRpZihidWYubGVuZ3RoID4gMTAwMDApIHJldHVybiBjcmMzMl9idWZfOChidWYpO1xuXHRmb3IodmFyIGNyYyA9IC0xLCBpID0gMCwgTD1idWYubGVuZ3RoLTM7IGkgPCBMOykge1xuXHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyY15idWZbaSsrXSkmMHhGRl07XG5cdFx0Y3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjXmJ1ZltpKytdKSYweEZGXTtcblx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmNeYnVmW2krK10pJjB4RkZdO1xuXHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyY15idWZbaSsrXSkmMHhGRl07XG5cdH1cblx0d2hpbGUoaSA8IEwrMykgY3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjXmJ1ZltpKytdKSYweEZGXTtcblx0cmV0dXJuIGNyYyBeIC0xO1xufVxuXG5mdW5jdGlvbiBjcmMzMl9idWZfOChidWYpIHtcblx0Zm9yKHZhciBjcmMgPSAtMSwgaSA9IDAsIEw9YnVmLmxlbmd0aC03OyBpIDwgTDspIHtcblx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmNeYnVmW2krK10pJjB4RkZdO1xuXHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyY15idWZbaSsrXSkmMHhGRl07XG5cdFx0Y3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjXmJ1ZltpKytdKSYweEZGXTtcblx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmNeYnVmW2krK10pJjB4RkZdO1xuXHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyY15idWZbaSsrXSkmMHhGRl07XG5cdFx0Y3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjXmJ1ZltpKytdKSYweEZGXTtcblx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmNeYnVmW2krK10pJjB4RkZdO1xuXHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyY15idWZbaSsrXSkmMHhGRl07XG5cdH1cblx0d2hpbGUoaSA8IEwrNykgY3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjXmJ1ZltpKytdKSYweEZGXTtcblx0cmV0dXJuIGNyYyBeIC0xO1xufVxuXG4vKiBtdWNoIG11Y2ggZmFzdGVyIHRvIGludGVydHdpbmUgdXRmOCBhbmQgY3JjICovXG5mdW5jdGlvbiBjcmMzMl9zdHIoc3RyKSB7XG5cdGZvcih2YXIgY3JjID0gLTEsIGkgPSAwLCBMPXN0ci5sZW5ndGgsIGMsIGQ7IGkgPCBMOykge1xuXHRcdGMgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuXHRcdGlmKGMgPCAweDgwKSB7XG5cdFx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBjKSAmIDB4RkZdO1xuXHRcdH0gZWxzZSBpZihjIDwgMHg4MDApIHtcblx0XHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeICgxOTJ8KChjPj42KSYzMSkpKSAmIDB4RkZdO1xuXHRcdFx0Y3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjIF4gKDEyOHwoYyY2MykpKSAmIDB4RkZdO1xuXHRcdH0gZWxzZSBpZihjID49IDB4RDgwMCAmJiBjIDwgMHhFMDAwKSB7XG5cdFx0XHRjID0gKGMmMTAyMykrNjQ7IGQgPSBzdHIuY2hhckNvZGVBdChpKyspICYgMTAyMztcblx0XHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeICgyNDB8KChjPj44KSY3KSkpICYgMHhGRl07XG5cdFx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiAoMTI4fCgoYz4+MikmNjMpKSkgJiAweEZGXTtcblx0XHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeICgxMjh8KChkPj42KSYxNSl8KGMmMykpKSAmIDB4RkZdO1xuXHRcdFx0Y3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjIF4gKDEyOHwoZCY2MykpKSAmIDB4RkZdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiAoMjI0fCgoYz4+MTIpJjE1KSkpICYgMHhGRl07XG5cdFx0XHRjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiAoMTI4fCgoYz4+NikmNjMpKSkgJiAweEZGXTtcblx0XHRcdGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeICgxMjh8KGMmNjMpKSkgJiAweEZGXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGNyYyBeIC0xO1xufVxuQ1JDMzIudGFibGUgPSB0YWJsZTtcbkNSQzMyLmJzdHIgPSBjcmMzMl9ic3RyO1xuQ1JDMzIuYnVmID0gY3JjMzJfYnVmO1xuQ1JDMzIuc3RyID0gY3JjMzJfc3RyO1xufSkpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/crc-32/crc32.js\n");
18
+
19
+ /***/ }),
20
+
21
+ /***/ "../../../node_modules/pako/index.js":
22
+ /*!*******************************************!*\
23
+ !*** ../../../node_modules/pako/index.js ***!
24
+ \*******************************************/
25
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
26
+
27
+ "use strict";
28
+ eval("// Top level file is just a mixin of submodules & constants\n\n\nvar assign = __webpack_require__(/*! ./lib/utils/common */ \"../../../node_modules/pako/lib/utils/common.js\").assign;\n\nvar deflate = __webpack_require__(/*! ./lib/deflate */ \"../../../node_modules/pako/lib/deflate.js\");\nvar inflate = __webpack_require__(/*! ./lib/inflate */ \"../../../node_modules/pako/lib/inflate.js\");\nvar constants = __webpack_require__(/*! ./lib/zlib/constants */ \"../../../node_modules/pako/lib/zlib/constants.js\");\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vaW5kZXguanMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDYTs7QUFFYixnQkFBZ0Isc0dBQW9DOztBQUVwRCxnQkFBZ0IsbUJBQU8sQ0FBQyxnRUFBZTtBQUN2QyxnQkFBZ0IsbUJBQU8sQ0FBQyxnRUFBZTtBQUN2QyxnQkFBZ0IsbUJBQU8sQ0FBQyw4RUFBc0I7O0FBRTlDOztBQUVBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzP2M3OTYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/pako/index.js\n");
29
+
30
+ /***/ }),
31
+
32
+ /***/ "../../../node_modules/pako/lib/deflate.js":
33
+ /*!*************************************************!*\
34
+ !*** ../../../node_modules/pako/lib/deflate.js ***!
35
+ \*************************************************/
36
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
37
+
38
+ "use strict";
39
+ eval("\n\n\nvar zlib_deflate = __webpack_require__(/*! ./zlib/deflate */ \"../../../node_modules/pako/lib/zlib/deflate.js\");\nvar utils = __webpack_require__(/*! ./utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\nvar strings = __webpack_require__(/*! ./utils/strings */ \"../../../node_modules/pako/lib/utils/strings.js\");\nvar msg = __webpack_require__(/*! ./zlib/messages */ \"../../../node_modules/pako/lib/zlib/messages.js\");\nvar ZStream = __webpack_require__(/*! ./zlib/zstream */ \"../../../node_modules/pako/lib/zlib/zstream.js\");\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH = 0;\nvar Z_FINISH = 4;\n\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_SYNC_FLUSH = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY = 0;\n\nvar Z_DEFLATED = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n * - `text` (Boolean) - true if compressed data believed to be text\n * - `time` (Number) - modification time, unix timestamp\n * - `os` (Number) - operation system code\n * - `extra` (Array) - array of bytes with extra data (max 65536)\n * - `name` (String) - file name (binary string)\n * - `comment` (String) - comment (binary string)\n * - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true); // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n if (!(this instanceof Deflate)) return new Deflate(options);\n\n this.options = utils.assign({\n level: Z_DEFAULT_COMPRESSION,\n method: Z_DEFLATED,\n chunkSize: 16384,\n windowBits: 15,\n memLevel: 8,\n strategy: Z_DEFAULT_STRATEGY,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n if (opt.raw && (opt.windowBits > 0)) {\n opt.windowBits = -opt.windowBits;\n }\n\n else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n opt.windowBits += 16;\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_deflate.deflateInit2(\n this.strm,\n opt.level,\n opt.method,\n opt.windowBits,\n opt.memLevel,\n opt.strategy\n );\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n if (opt.header) {\n zlib_deflate.deflateSetHeader(this.strm, opt.header);\n }\n\n if (opt.dictionary) {\n var dict;\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n // If we need to compress text, change encoding to utf8.\n dict = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n dict = new Uint8Array(opt.dictionary);\n } else {\n dict = opt.dictionary;\n }\n\n status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n if (status !== Z_OK) {\n throw new Error(msg[status]);\n }\n\n this._dict_set = true;\n }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n * converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var status, _mode;\n\n if (this.ended) { return false; }\n\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // If we need to compress text, change encoding to utf8.\n strm.input = strings.string2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n status = zlib_deflate.deflate(strm, _mode); /* no bad return value */\n\n if (status !== Z_STREAM_END && status !== Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n if (this.options.to === 'string') {\n this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n // Finalize on the last chunk.\n if (_mode === Z_FINISH) {\n status = zlib_deflate.deflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === Z_SYNC_FLUSH) {\n this.onEnd(Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n * (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n var deflator = new Deflate(options);\n\n deflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n options = options || {};\n options.gzip = true;\n return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2RlZmxhdGUuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7OztBQUdiLG1CQUFtQixtQkFBTyxDQUFDLHNFQUFnQjtBQUMzQyxtQkFBbUIsbUJBQU8sQ0FBQyxzRUFBZ0I7QUFDM0MsbUJBQW1CLG1CQUFPLENBQUMsd0VBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLHdFQUFpQjtBQUM1QyxtQkFBbUIsbUJBQU8sQ0FBQyxzRUFBZ0I7O0FBRTNDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFNBQVM7QUFDN0M7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsZUFBZTs7QUFFbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4Qix3QkFBd0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7O0FBRXBCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7O0FBRW5EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxlQUFlO0FBQ2YsZUFBZTtBQUNmLGtCQUFrQjtBQUNsQixZQUFZIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzPzdjNjciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2RlZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvZGVmbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgbXNnICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL21lc3NhZ2VzJyk7XG52YXIgWlN0cmVhbSAgICAgID0gcmVxdWlyZSgnLi96bGliL3pzdHJlYW0nKTtcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbnZhciBaX05PX0ZMVVNIICAgICAgPSAwO1xudmFyIFpfRklOSVNIICAgICAgICA9IDQ7XG5cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcblxudmFyIFpfREVGQVVMVF9DT01QUkVTU0lPTiA9IC0xO1xuXG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxudmFyIFpfREVGTEFURUQgID0gODtcblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG4vKipcbiAqIGNsYXNzIERlZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tkZWZsYXRlXV0sXG4gKiBbW2RlZmxhdGVSYXddXSBhbmQgW1tnemlwXV0uXG4gKiovXG5cbi8qIGludGVybmFsXG4gKiBEZWZsYXRlLmNodW5rcyAtPiBBcnJheVxuICpcbiAqIENodW5rcyBvZiBvdXRwdXQgZGF0YSwgaWYgW1tEZWZsYXRlI29uRGF0YV1dIG5vdCBvdmVycmlkZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zIFpfRklOSVNILlxuICpcbiAqIFNlbmRzIGlucHV0IGRhdGEgdG8gZGVmbGF0ZSBwaXBlLCBnZW5lcmF0aW5nIFtbRGVmbGF0ZSNvbkRhdGFdXSBjYWxscyB3aXRoXG4gKiBuZXcgY29tcHJlc3NlZCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0RlZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0RlZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBhcnJheSBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuXG4gIGlmICh0aGlzLmVuZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gIF9tb2RlID0gKG1vZGUgPT09IH5+bW9kZSkgPyBtb2RlIDogKChtb2RlID09PSB0cnVlKSA/IFpfRklOSVNIIDogWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICBzdHJtLmlucHV0ID0gc3RyaW5ncy5zdHJpbmcyYnVmKGRhdGEpO1xuICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGF0YSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICBzdHJtLmlucHV0ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgc3RybS5pbnB1dCA9IGRhdGE7XG4gIH1cblxuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmF2YWlsX2luID0gc3RybS5pbnB1dC5sZW5ndGg7XG5cbiAgZG8ge1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgc3RybS5vdXRwdXQgPSBuZXcgdXRpbHMuQnVmOChjaHVua1NpemUpO1xuICAgICAgc3RybS5uZXh0X291dCA9IDA7XG4gICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZTtcbiAgICB9XG4gICAgc3RhdHVzID0gemxpYl9kZWZsYXRlLmRlZmxhdGUoc3RybSwgX21vZGUpOyAgICAvKiBubyBiYWQgcmV0dXJuIHZhbHVlICovXG5cbiAgICBpZiAoc3RhdHVzICE9PSBaX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBaX09LKSB7XG4gICAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gWl9GSU5JU0ggfHwgX21vZGUgPT09IFpfU1lOQ19GTFVTSCkpKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm9uRGF0YShzdHJpbmdzLmJ1ZjJiaW5zdHJpbmcodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkRhdGEodXRpbHMuc2hyaW5rQnVmKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KSk7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EKTtcblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBaX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFpfT0s7XG4gIH1cblxuICAvLyBjYWxsYmFjayBpbnRlcmltIHJlc3VsdHMgaWYgWl9TWU5DX0ZMVVNILlxuICBpZiAoX21vZGUgPT09IFpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogRGVmbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3V0cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnIHx8IG1zZ1tkZWZsYXRvci5lcnJdOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/deflate.js\n");
40
+
41
+ /***/ }),
42
+
43
+ /***/ "../../../node_modules/pako/lib/inflate.js":
44
+ /*!*************************************************!*\
45
+ !*** ../../../node_modules/pako/lib/inflate.js ***!
46
+ \*************************************************/
47
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
48
+
49
+ "use strict";
50
+ eval("\n\n\nvar zlib_inflate = __webpack_require__(/*! ./zlib/inflate */ \"../../../node_modules/pako/lib/zlib/inflate.js\");\nvar utils = __webpack_require__(/*! ./utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\nvar strings = __webpack_require__(/*! ./utils/strings */ \"../../../node_modules/pako/lib/utils/strings.js\");\nvar c = __webpack_require__(/*! ./zlib/constants */ \"../../../node_modules/pako/lib/zlib/constants.js\");\nvar msg = __webpack_require__(/*! ./zlib/messages */ \"../../../node_modules/pako/lib/zlib/messages.js\");\nvar ZStream = __webpack_require__(/*! ./zlib/zstream */ \"../../../node_modules/pako/lib/zlib/zstream.js\");\nvar GZheader = __webpack_require__(/*! ./zlib/gzheader */ \"../../../node_modules/pako/lib/zlib/gzheader.js\");\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n * , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n if (!(this instanceof Inflate)) return new Inflate(options);\n\n this.options = utils.assign({\n chunkSize: 16384,\n windowBits: 0,\n to: ''\n }, options || {});\n\n var opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new ZStream();\n this.strm.avail_out = 0;\n\n var status = zlib_inflate.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n\n this.header = new GZheader();\n\n zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== c.Z_OK) {\n throw new Error(msg[status]);\n }\n }\n }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n var strm = this.strm;\n var chunkSize = this.options.chunkSize;\n var dictionary = this.options.dictionary;\n var status, _mode;\n var next_out_utf8, tail, utf8str;\n\n // Flag to properly process Z_BUF_ERROR on testing inflate call\n // when we check that all output data was flushed.\n var allowBufError = false;\n\n if (this.ended) { return false; }\n _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n // Convert data if needed\n if (typeof data === 'string') {\n // Only binary strings can be decompressed on practice\n strm.input = strings.binstring2buf(data);\n } else if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n do {\n if (strm.avail_out === 0) {\n strm.output = new utils.Buf8(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */\n\n if (status === c.Z_NEED_DICT && dictionary) {\n status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n }\n\n if (status === c.Z_BUF_ERROR && allowBufError === true) {\n status = c.Z_OK;\n allowBufError = false;\n }\n\n if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n if (this.options.to === 'string') {\n\n next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n tail = strm.next_out - next_out_utf8;\n utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n this.onData(utf8str);\n\n } else {\n this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n }\n }\n }\n\n // When no more input data, we should check that internal inflate buffers\n // are flushed. The only way to do it when avail_out = 0 - run one more\n // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n // Here we set flag to process this error properly.\n //\n // NOTE. Deflate does not return error in this case and does not needs such\n // logic.\n if (strm.avail_in === 0 && strm.avail_out === 0) {\n allowBufError = true;\n }\n\n } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n if (status === c.Z_STREAM_END) {\n _mode = c.Z_FINISH;\n }\n\n // Finalize on the last chunk.\n if (_mode === c.Z_FINISH) {\n status = zlib_inflate.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return status === c.Z_OK;\n }\n\n // callback interim results if Z_SYNC_FLUSH.\n if (_mode === c.Z_SYNC_FLUSH) {\n this.onEnd(c.Z_OK);\n strm.avail_out = 0;\n return true;\n }\n\n return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n * on js engine support. When string output requested, each chunk\n * will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === c.Z_OK) {\n if (this.options.to === 'string') {\n // Glue & convert here, until we teach pako to send\n // utf8 aligned strings to onData\n this.result = this.chunks.join('');\n } else {\n this.result = utils.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n * , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n * , output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err)\n * console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n var inflator = new Inflate(options);\n\n inflator.push(input, true);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip = inflate;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7OztBQUdiLG1CQUFtQixtQkFBTyxDQUFDLHNFQUFnQjtBQUMzQyxtQkFBbUIsbUJBQU8sQ0FBQyxzRUFBZ0I7QUFDM0MsbUJBQW1CLG1CQUFPLENBQUMsd0VBQWlCO0FBQzVDLG1CQUFtQixtQkFBTyxDQUFDLDBFQUFrQjtBQUM3QyxtQkFBbUIsbUJBQU8sQ0FBQyx3RUFBaUI7QUFDNUMsbUJBQW1CLG1CQUFPLENBQUMsc0VBQWdCO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLHdFQUFpQjs7QUFFNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFNBQVM7QUFDN0M7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWU7O0FBRWxCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QjtBQUN4Qix3QkFBd0I7QUFDeEIsd0JBQXdCO0FBQ3hCLHdCQUF3Qjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBEOztBQUUxRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCOztBQUV0Qjs7QUFFQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCOztBQUV0QjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsZUFBZTtBQUNmLGVBQWU7QUFDZixrQkFBa0I7QUFDbEIsY0FBYyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvaW5mbGF0ZS5qcz8yOWQ3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9pbmZsYXRlID0gcmVxdWlyZSgnLi96bGliL2luZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIGMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9jb25zdGFudHMnKTtcbnZhciBtc2cgICAgICAgICAgPSByZXF1aXJlKCcuL3psaWIvbWVzc2FnZXMnKTtcbnZhciBaU3RyZWFtICAgICAgPSByZXF1aXJlKCcuL3psaWIvenN0cmVhbScpO1xudmFyIEdaaGVhZGVyICAgICA9IHJlcXVpcmUoJy4vemxpYi9nemhlYWRlcicpO1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIGNsYXNzIEluZmxhdGVcbiAqXG4gKiBHZW5lcmljIEpTLXN0eWxlIHdyYXBwZXIgZm9yIHpsaWIgY2FsbHMuIElmIHlvdSBkb24ndCBuZWVkXG4gKiBzdHJlYW1pbmcgYmVoYXZpb3VyIC0gdXNlIG1vcmUgc2ltcGxlIGZ1bmN0aW9uczogW1tpbmZsYXRlXV1cbiAqIGFuZCBbW2luZmxhdGVSYXddXS5cbiAqKi9cblxuLyogaW50ZXJuYWxcbiAqIGluZmxhdGUuY2h1bmtzIC0+IEFycmF5XG4gKlxuICogQ2h1bmtzIG9mIG91dHB1dCBkYXRhLCBpZiBbW0luZmxhdGUjb25EYXRhXV0gbm90IG92ZXJyaWRkZW4uXG4gKiovXG5cbi8qKlxuICogSW5mbGF0ZS5yZXN1bHQgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqXG4gKiBVbmNvbXByZXNzZWQgcmVzdWx0LCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBbW0luZmxhdGUjb25EYXRhXV1cbiAqIGFuZCBbW0luZmxhdGUjb25FbmRdXSBoYW5kbGVycy4gRmlsbGVkIGFmdGVyIHlvdSBwdXNoIGxhc3QgY2h1bmtcbiAqIChjYWxsIFtbSW5mbGF0ZSNwdXNoXV0gd2l0aCBgWl9GSU5JU0hgIC8gYHRydWVgIHBhcmFtKSBvciBpZiB5b3VcbiAqIHB1c2ggYSBjaHVuayB3aXRoIGV4cGxpY2l0IGZsdXNoIChjYWxsIFtbSW5mbGF0ZSNwdXNoXV0gd2l0aFxuICogYFpfU1lOQ19GTFVTSGAgcGFyYW0pLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUuZXJyIC0+IE51bWJlclxuICpcbiAqIEVycm9yIGNvZGUgYWZ0ZXIgaW5mbGF0ZSBmaW5pc2hlZC4gMCAoWl9PSykgb24gc3VjY2Vzcy5cbiAqIFNob3VsZCBiZSBjaGVja2VkIGlmIGJyb2tlbiBkYXRhIHBvc3NpYmxlLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUubXNnIC0+IFN0cmluZ1xuICpcbiAqIEVycm9yIG1lc3NhZ2UsIGlmIFtbSW5mbGF0ZS5lcnJdXSAhPSAwXG4gKiovXG5cblxuLyoqXG4gKiBuZXcgSW5mbGF0ZShvcHRpb25zKVxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBDcmVhdGVzIG5ldyBpbmZsYXRvciBpbnN0YW5jZSB3aXRoIHNwZWNpZmllZCBwYXJhbXMuIFRocm93cyBleGNlcHRpb25cbiAqIG9uIGJhZCBwYXJhbXMuIFN1cHBvcnRlZCBvcHRpb25zOlxuICpcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBkaWN0aW9uYXJ5YFxuICpcbiAqIFtodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWRdKGh0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlLlxuICpcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucywgZm9yIGludGVybmFsIG5lZWRzOlxuICpcbiAqIC0gYGNodW5rU2l6ZWAgLSBzaXplIG9mIGdlbmVyYXRlZCBkYXRhIGNodW5rcyAoMTZLIGJ5IGRlZmF1bHQpXG4gKiAtIGByYXdgIChCb29sZWFuKSAtIGRvIHJhdyBpbmZsYXRlXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWRcbiAqICAgZnJvbSB1dGY4IHRvIHV0ZjE2IChqYXZhc2NyaXB0KSBzdHJpbmcuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsXG4gKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICpcbiAqIEJ5IGRlZmF1bHQsIHdoZW4gbm8gb3B0aW9ucyBzZXQsIGF1dG9kZXRlY3QgZGVmbGF0ZS9nemlwIGRhdGEgZm9ybWF0IHZpYVxuICogd3JhcHBlciBoZWFkZXIuXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGNodW5rMSA9IFVpbnQ4QXJyYXkoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBjaHVuazIgPSBVaW50OEFycmF5KFsxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOV0pO1xuICpcbiAqIHZhciBpbmZsYXRlID0gbmV3IHBha28uSW5mbGF0ZSh7IGxldmVsOiAzfSk7XG4gKlxuICogaW5mbGF0ZS5wdXNoKGNodW5rMSwgZmFsc2UpO1xuICogaW5mbGF0ZS5wdXNoKGNodW5rMiwgdHJ1ZSk7ICAvLyB0cnVlIC0+IGxhc3QgY2h1bmtcbiAqXG4gKiBpZiAoaW5mbGF0ZS5lcnIpIHsgdGhyb3cgbmV3IEVycm9yKGluZmxhdGUuZXJyKTsgfVxuICpcbiAqIGNvbnNvbGUubG9nKGluZmxhdGUucmVzdWx0KTtcbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gSW5mbGF0ZShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBJbmZsYXRlKSkgcmV0dXJuIG5ldyBJbmZsYXRlKG9wdGlvbnMpO1xuXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmFzc2lnbih7XG4gICAgY2h1bmtTaXplOiAxNjM4NCxcbiAgICB3aW5kb3dCaXRzOiAwLFxuICAgIHRvOiAnJ1xuICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgb3B0ID0gdGhpcy5vcHRpb25zO1xuXG4gIC8vIEZvcmNlIHdpbmRvdyBzaXplIGZvciBgcmF3YCBkYXRhLCBpZiBub3Qgc2V0IGRpcmVjdGx5LFxuICAvLyBiZWNhdXNlIHdlIGhhdmUgbm8gaGVhZGVyIGZvciBhdXRvZGV0ZWN0LlxuICBpZiAob3B0LnJhdyAmJiAob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpKSB7XG4gICAgb3B0LndpbmRvd0JpdHMgPSAtb3B0LndpbmRvd0JpdHM7XG4gICAgaWYgKG9wdC53aW5kb3dCaXRzID09PSAwKSB7IG9wdC53aW5kb3dCaXRzID0gLTE1OyB9XG4gIH1cblxuICAvLyBJZiBgd2luZG93Qml0c2Agbm90IGRlZmluZWQgKGFuZCBtb2RlIG5vdCByYXcpIC0gc2V0IGF1dG9kZXRlY3QgZmxhZyBmb3IgZ3ppcC9kZWZsYXRlXG4gIGlmICgob3B0LndpbmRvd0JpdHMgPj0gMCkgJiYgKG9wdC53aW5kb3dCaXRzIDwgMTYpICYmXG4gICAgICAhKG9wdGlvbnMgJiYgb3B0aW9ucy53aW5kb3dCaXRzKSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDMyO1xuICB9XG5cbiAgLy8gR3ppcCBoZWFkZXIgaGFzIG5vIGluZm8gYWJvdXQgd2luZG93cyBzaXplLCB3ZSBjYW4gZG8gYXV0b2RldGVjdCBvbmx5XG4gIC8vIGZvciBkZWZsYXRlLiBTbywgaWYgd2luZG93IHNpemUgbm90IHNldCwgZm9yY2UgaXQgdG8gbWF4IHdoZW4gZ3ppcCBwb3NzaWJsZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID4gMTUpICYmIChvcHQud2luZG93Qml0cyA8IDQ4KSkge1xuICAgIC8vIGJpdCAzICgxNikgLT4gZ3ppcHBlZCBkYXRhXG4gICAgLy8gYml0IDQgKDMyKSAtPiBhdXRvZGV0ZWN0IGd6aXAvZGVmbGF0ZVxuICAgIGlmICgob3B0LndpbmRvd0JpdHMgJiAxNSkgPT09IDApIHtcbiAgICAgIG9wdC53aW5kb3dCaXRzIHw9IDE1O1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuZXJyICAgID0gMDsgICAgICAvLyBlcnJvciBjb2RlLCBpZiBoYXBwZW5zICgwID0gWl9PSylcbiAgdGhpcy5tc2cgICAgPSAnJzsgICAgIC8vIGVycm9yIG1lc3NhZ2VcbiAgdGhpcy5lbmRlZCAgPSBmYWxzZTsgIC8vIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGUgb25FbmQoKSBjYWxsc1xuICB0aGlzLmNodW5rcyA9IFtdOyAgICAgLy8gY2h1bmtzIG9mIGNvbXByZXNzZWQgZGF0YVxuXG4gIHRoaXMuc3RybSAgID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyAgPSB6bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKFxuICAgIHRoaXMuc3RybSxcbiAgICBvcHQud2luZG93Qml0c1xuICApO1xuXG4gIGlmIChzdGF0dXMgIT09IGMuWl9PSykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gIH1cblxuICB0aGlzLmhlYWRlciA9IG5ldyBHWmhlYWRlcigpO1xuXG4gIHpsaWJfaW5mbGF0ZS5pbmZsYXRlR2V0SGVhZGVyKHRoaXMuc3RybSwgdGhpcy5oZWFkZXIpO1xuXG4gIC8vIFNldHVwIGRpY3Rpb25hcnlcbiAgaWYgKG9wdC5kaWN0aW9uYXJ5KSB7XG4gICAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2Ygb3B0LmRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHQuZGljdGlvbmFyeSA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKG9wdC5kaWN0aW9uYXJ5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuICAgICAgb3B0LmRpY3Rpb25hcnkgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIGlmIChvcHQucmF3KSB7IC8vSW4gcmF3IG1vZGUgd2UgbmVlZCB0byBzZXQgdGhlIGRpY3Rpb25hcnkgZWFybHlcbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIG9wdC5kaWN0aW9uYXJ5KTtcbiAgICAgIGlmIChzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluZmxhdGUjcHVzaChkYXRhWywgbW9kZV0pIC0+IEJvb2xlYW5cbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxBcnJheUJ1ZmZlcnxTdHJpbmcpOiBpbnB1dCBkYXRhXG4gKiAtIG1vZGUgKE51bWJlcnxCb29sZWFuKTogMC4uNiBmb3IgY29ycmVzcG9uZGluZyBaX05PX0ZMVVNILi5aX1RSRUUgbW9kZXMuXG4gKiAgIFNlZSBjb25zdGFudHMuIFNraXBwZWQgb3IgYGZhbHNlYCBtZWFucyBaX05PX0ZMVVNILCBgdHJ1ZWAgbWVhbnMgWl9GSU5JU0guXG4gKlxuICogU2VuZHMgaW5wdXQgZGF0YSB0byBpbmZsYXRlIHBpcGUsIGdlbmVyYXRpbmcgW1tJbmZsYXRlI29uRGF0YV1dIGNhbGxzIHdpdGhcbiAqIG5ldyBvdXRwdXQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tJbmZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgZGVjb21wcmVzc2lvbiBjb250ZXh0LlxuICpcbiAqIE9uIGZhaWwgY2FsbCBbW0luZmxhdGUjb25FbmRdXSB3aXRoIGVycm9yIGNvZGUgYW5kIHJldHVybiBmYWxzZS5cbiAqXG4gKiBXZSBzdHJvbmdseSByZWNvbW1lbmQgdG8gdXNlIGBVaW50OEFycmF5YCBvbiBpbnB1dCBmb3IgYmVzdCBzcGVlZCAob3V0cHV0XG4gKiBmb3JtYXQgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSkuIEFsc28sIGRvbid0IHNraXAgbGFzdCBwYXJhbSBhbmQgYWx3YXlzXG4gKiB1c2UgdGhlIHNhbWUgdHlwZSBpbiB5b3VyIGNvZGUgKGJvb2xlYW4gb3IgbnVtYmVyKS4gVGhhdCB3aWxsIGltcHJvdmUgSlMgc3BlZWQuXG4gKlxuICogRm9yIHJlZ3VsYXIgYEFycmF5YC1zIG1ha2Ugc3VyZSBhbGwgZWxlbWVudHMgYXJlIFswLi4yNTVdLlxuICpcbiAqICMjIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBwdXNoKGNodW5rLCBmYWxzZSk7IC8vIHB1c2ggb25lIG9mIGRhdGEgY2h1bmtzXG4gKiAuLi5cbiAqIHB1c2goY2h1bmssIHRydWUpOyAgLy8gcHVzaCBsYXN0IGNodW5rXG4gKiBgYGBcbiAqKi9cbkluZmxhdGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoZGF0YSwgbW9kZSkge1xuICB2YXIgc3RybSA9IHRoaXMuc3RybTtcbiAgdmFyIGNodW5rU2l6ZSA9IHRoaXMub3B0aW9ucy5jaHVua1NpemU7XG4gIHZhciBkaWN0aW9uYXJ5ID0gdGhpcy5vcHRpb25zLmRpY3Rpb25hcnk7XG4gIHZhciBzdGF0dXMsIF9tb2RlO1xuICB2YXIgbmV4dF9vdXRfdXRmOCwgdGFpbCwgdXRmOHN0cjtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICBzdGF0dXMgPSB6bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0aW9uYXJ5KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSBjLlpfQlVGX0VSUk9SICYmIGFsbG93QnVmRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIHN0YXR1cyA9IGMuWl9PSztcbiAgICAgIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCAmJiBzdGF0dXMgIT09IGMuWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0cm0ubmV4dF9vdXQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCBzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EIHx8IChzdHJtLmF2YWlsX2luID09PSAwICYmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCB8fCBfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpKSkge1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudG8gPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICBuZXh0X291dF91dGY4ID0gc3RyaW5ncy51dGY4Ym9yZGVyKHN0cm0ub3V0cHV0LCBzdHJtLm5leHRfb3V0KTtcblxuICAgICAgICAgIHRhaWwgPSBzdHJtLm5leHRfb3V0IC0gbmV4dF9vdXRfdXRmODtcbiAgICAgICAgICB1dGY4c3RyID0gc3RyaW5ncy5idWYyc3RyaW5nKHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4KTtcblxuICAgICAgICAgIC8vIG1vdmUgdGFpbFxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSB0YWlsO1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gY2h1bmtTaXplIC0gdGFpbDtcbiAgICAgICAgICBpZiAodGFpbCkgeyB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgc3RybS5vdXRwdXQsIG5leHRfb3V0X3V0ZjgsIHRhaWwsIDApOyB9XG5cbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGY4c3RyKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hlbiBubyBtb3JlIGlucHV0IGRhdGEsIHdlIHNob3VsZCBjaGVjayB0aGF0IGludGVybmFsIGluZmxhdGUgYnVmZmVyc1xuICAgIC8vIGFyZSBmbHVzaGVkLiBUaGUgb25seSB3YXkgdG8gZG8gaXQgd2hlbiBhdmFpbF9vdXQgPSAwIC0gcnVuIG9uZSBtb3JlXG4gICAgLy8gaW5mbGF0ZSBwYXNzLiBCdXQgaWYgb3V0cHV0IGRhdGEgbm90IGV4aXN0cywgaW5mbGF0ZSByZXR1cm4gWl9CVUZfRVJST1IuXG4gICAgLy8gSGVyZSB3ZSBzZXQgZmxhZyB0byBwcm9jZXNzIHRoaXMgZXJyb3IgcHJvcGVybHkuXG4gICAgLy9cbiAgICAvLyBOT1RFLiBEZWZsYXRlIGRvZXMgbm90IHJldHVybiBlcnJvciBpbiB0aGlzIGNhc2UgYW5kIGRvZXMgbm90IG5lZWRzIHN1Y2hcbiAgICAvLyBsb2dpYy5cbiAgICBpZiAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiBzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgYWxsb3dCdWZFcnJvciA9IHRydWU7XG4gICAgfVxuXG4gIH0gd2hpbGUgKChzdHJtLmF2YWlsX2luID4gMCB8fCBzdHJtLmF2YWlsX291dCA9PT0gMCkgJiYgc3RhdHVzICE9PSBjLlpfU1RSRUFNX0VORCk7XG5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX1NUUkVBTV9FTkQpIHtcbiAgICBfbW9kZSA9IGMuWl9GSU5JU0g7XG4gIH1cblxuICAvLyBGaW5hbGl6ZSBvbiB0aGUgbGFzdCBjaHVuay5cbiAgaWYgKF9tb2RlID09PSBjLlpfRklOSVNIKSB7XG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGVFbmQodGhpcy5zdHJtKTtcbiAgICB0aGlzLm9uRW5kKHN0YXR1cyk7XG4gICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgcmV0dXJuIHN0YXR1cyA9PT0gYy5aX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBjLlpfU1lOQ19GTFVTSCkge1xuICAgIHRoaXMub25FbmQoYy5aX09LKTtcbiAgICBzdHJtLmF2YWlsX291dCA9IDA7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqXG4gKiBJbmZsYXRlI29uRGF0YShjaHVuaykgLT4gVm9pZFxuICogLSBjaHVuayAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBvdXRwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGlnbmVkIHN0cmluZ3MgdG8gb25EYXRhXG4gICAgICB0aGlzLnJlc3VsdCA9IHRoaXMuY2h1bmtzLmpvaW4oJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IHV0aWxzLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNodW5rcyA9IFtdO1xuICB0aGlzLmVyciA9IHN0YXR1cztcbiAgdGhpcy5tc2cgPSB0aGlzLnN0cm0ubXNnO1xufTtcblxuXG4vKipcbiAqIGluZmxhdGUoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogRGVjb21wcmVzcyBgZGF0YWAgd2l0aCBpbmZsYXRlL3VuZ3ppcCBhbmQgYG9wdGlvbnNgLiBBdXRvZGV0ZWN0XG4gKiBmb3JtYXQgdmlhIHdyYXBwZXIgaGVhZGVyIGJ5IGRlZmF1bHQuIFRoYXQncyB3aHkgd2UgZG9uJ3QgcHJvdmlkZVxuICogc2VwYXJhdGUgYHVuZ3ppcGAgbWV0aG9kLlxuICpcbiAqIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiAqXG4gKiAtIHdpbmRvd0JpdHNcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBjb252ZXJ0ZWRcbiAqICAgZnJvbSB1dGY4IHRvIHV0ZjE2IChqYXZhc2NyaXB0KSBzdHJpbmcuIFdoZW4gc3RyaW5nIG91dHB1dCByZXF1ZXN0ZWQsXG4gKiAgIGNodW5rIGxlbmd0aCBjYW4gZGlmZmVyIGZyb20gYGNodW5rU2l6ZWAsIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICpcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgaW5wdXQgPSBwYWtvLmRlZmxhdGUoWzEsMiwzLDQsNSw2LDcsOCw5XSlcbiAqICAgLCBvdXRwdXQ7XG4gKlxuICogdHJ5IHtcbiAqICAgb3V0cHV0ID0gcGFrby5pbmZsYXRlKGlucHV0KTtcbiAqIH0gY2F0Y2ggKGVycilcbiAqICAgY29uc29sZS5sb2coZXJyKTtcbiAqIH1cbiAqIGBgYFxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucykge1xuICB2YXIgaW5mbGF0b3IgPSBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICBpbmZsYXRvci5wdXNoKGlucHV0LCB0cnVlKTtcblxuICAvLyBUaGF0IHdpbGwgbmV2ZXIgaGFwcGVucywgaWYgeW91IGRvbid0IGNoZWF0IHdpdGggb3B0aW9ucyA6KVxuICBpZiAoaW5mbGF0b3IuZXJyKSB7IHRocm93IGluZmxhdG9yLm1zZyB8fCBtc2dbaW5mbGF0b3IuZXJyXTsgfVxuXG4gIHJldHVybiBpbmZsYXRvci5yZXN1bHQ7XG59XG5cblxuLyoqXG4gKiBpbmZsYXRlUmF3KGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbaW5mbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBpbmZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBpbmZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIHVuZ3ppcChkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBKdXN0IHNob3J0Y3V0IHRvIFtbaW5mbGF0ZV1dLCBiZWNhdXNlIGl0IGF1dG9kZXRlY3RzIGZvcm1hdFxuICogYnkgaGVhZGVyLmNvbnRlbnQuIERvbmUgZm9yIGNvbnZlbmllbmNlLlxuICoqL1xuXG5cbmV4cG9ydHMuSW5mbGF0ZSA9IEluZmxhdGU7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlUmF3ID0gaW5mbGF0ZVJhdztcbmV4cG9ydHMudW5nemlwICA9IGluZmxhdGU7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/inflate.js\n");
51
+
52
+ /***/ }),
53
+
54
+ /***/ "../../../node_modules/pako/lib/utils/common.js":
55
+ /*!******************************************************!*\
56
+ !*** ../../../node_modules/pako/lib/utils/common.js ***!
57
+ \******************************************************/
58
+ /***/ ((__unused_webpack_module, exports) => {
59
+
60
+ "use strict";
61
+ eval("\n\n\nvar TYPED_OK = (typeof Uint8Array !== 'undefined') &&\n (typeof Uint16Array !== 'undefined') &&\n (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n var sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n var source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (var p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n if (buf.length === size) { return buf; }\n if (buf.subarray) { return buf.subarray(0, size); }\n buf.length = size;\n return buf;\n};\n\n\nvar fnTyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n if (src.subarray && dest.subarray) {\n dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n return;\n }\n // Fallback to ordinary array\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n var i, l, len, pos, chunk, result;\n\n // calculate data length\n len = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n result = new Uint8Array(len);\n pos = 0;\n for (i = 0, l = chunks.length; i < l; i++) {\n chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n }\n};\n\nvar fnUntyped = {\n arraySet: function (dest, src, src_offs, len, dest_offs) {\n for (var i = 0; i < len; i++) {\n dest[dest_offs + i] = src[src_offs + i];\n }\n },\n // Join array of chunks to single array.\n flattenChunks: function (chunks) {\n return [].concat.apply([], chunks);\n }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n if (on) {\n exports.Buf8 = Uint8Array;\n exports.Buf16 = Uint16Array;\n exports.Buf32 = Int32Array;\n exports.assign(exports, fnTyped);\n } else {\n exports.Buf8 = Array;\n exports.Buf16 = Array;\n exports.Buf32 = Array;\n exports.assign(exports, fnUntyped);\n }\n};\n\nexports.setTyped(TYPED_OK);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7O0FBR2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0EsaUJBQWlCO0FBQ2pCLDZCQUE2QjtBQUM3QixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxPQUFPO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsSUFBSSxZQUFZO0FBQ2hCLElBQUksYUFBYTtBQUNqQixJQUFJLGFBQWE7QUFDakI7QUFDQSxJQUFJO0FBQ0osSUFBSSxZQUFZO0FBQ2hCLElBQUksYUFBYTtBQUNqQixJQUFJLGFBQWE7QUFDakI7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanM/NWQzYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbmZ1bmN0aW9uIF9oYXMob2JqLCBrZXkpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKF9oYXMoc291cmNlLCBwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/utils/common.js\n");
62
+
63
+ /***/ }),
64
+
65
+ /***/ "../../../node_modules/pako/lib/utils/strings.js":
66
+ /*!*******************************************************!*\
67
+ !*** ../../../node_modules/pako/lib/utils/strings.js ***!
68
+ \*******************************************************/
69
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
70
+
71
+ "use strict";
72
+ eval("// String encode/decode helpers\n\n\n\nvar utils = __webpack_require__(/*! ./common */ \"../../../node_modules/pako/lib/utils/common.js\");\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new utils.Buf8(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n }\n }\n\n var result = '';\n for (var i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n var buf = new utils.Buf8(str.length);\n for (var i = 0, len = buf.length; i < len; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n var i, out, c, c_len;\n var len = max || buf.length;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n var utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n var pos;\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDYTs7O0FBR2IsWUFBWSxtQkFBTyxDQUFDLGdFQUFVOzs7QUFHOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTSwwQ0FBMEMsYUFBYTtBQUM3RCxNQUFNLHNEQUFzRCxhQUFhOzs7QUFHekU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0EsbUNBQW1DOzs7QUFHbkM7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsYUFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7OztBQUdBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0Esb0NBQW9DLFNBQVM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBLG9CQUFvQixxQkFBcUI7O0FBRXpDO0FBQ0E7QUFDQSxxQkFBcUIsMEJBQTBCLGdCQUFnQjs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUIsMEJBQTBCOztBQUUvQztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOztBQUVBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0EsbURBQW1EOztBQUVuRDtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9zdHJpbmdzLmpzP2VmMmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU3RyaW5nIGVuY29kZS9kZWNvZGUgaGVscGVyc1xuJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuLy8gUXVpY2sgY2hlY2sgaWYgd2UgY2FuIHVzZSBmYXN0IGFycmF5IHRvIGJpbiBzdHJpbmcgY29udmVyc2lvblxuLy9cbi8vIC0gYXBwbHkoQXJyYXkpIGNhbiBmYWlsIG9uIEFuZHJvaWQgMi4yXG4vLyAtIGFwcGx5KFVpbnQ4QXJyYXkpIGNhbiBmYWlsIG9uIGlPUyA1LjEgU2FmYXJpXG4vL1xudmFyIFNUUl9BUFBMWV9PSyA9IHRydWU7XG52YXIgU1RSX0FQUExZX1VJQV9PSyA9IHRydWU7XG5cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgWyAwIF0pOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfT0sgPSBmYWxzZTsgfVxudHJ5IHsgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheSgxKSk7IH0gY2F0Y2ggKF9fKSB7IFNUUl9BUFBMWV9VSUFfT0sgPSBmYWxzZTsgfVxuXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IHV0aWxzLkJ1ZjgoMjU2KTtcbmZvciAodmFyIHEgPSAwOyBxIDwgMjU2OyBxKyspIHtcbiAgX3V0ZjhsZW5bcV0gPSAocSA+PSAyNTIgPyA2IDogcSA+PSAyNDggPyA1IDogcSA+PSAyNDAgPyA0IDogcSA+PSAyMjQgPyAzIDogcSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdID0gX3V0ZjhsZW5bMjU0XSA9IDE7IC8vIEludmFsaWQgc2VxdWVuY2Ugc3RhcnRcblxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG5leHBvcnRzLnN0cmluZzJidWYgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHZhciBidWYsIGMsIGMyLCBtX3BvcywgaSwgc3RyX2xlbiA9IHN0ci5sZW5ndGgsIGJ1Zl9sZW4gPSAwO1xuXG4gIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gIGZvciAobV9wb3MgPSAwOyBtX3BvcyA8IHN0cl9sZW47IG1fcG9zKyspIHtcbiAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MgKyAxIDwgc3RyX2xlbikpIHtcbiAgICAgIGMyID0gc3RyLmNoYXJDb2RlQXQobV9wb3MgKyAxKTtcbiAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKGMgLSAweGQ4MDApIDw8IDEwKSArIChjMiAtIDB4ZGMwMCk7XG4gICAgICAgIG1fcG9zKys7XG4gICAgICB9XG4gICAgfVxuICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gIH1cblxuICAvLyBhbGxvY2F0ZSBidWZmZXJcbiAgYnVmID0gbmV3IHV0aWxzLkJ1ZjgoYnVmX2xlbik7XG5cbiAgLy8gY29udmVydFxuICBmb3IgKGkgPSAwLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIC8qIG9uZSBieXRlICovXG4gICAgICBidWZbaSsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEMwIHwgKGMgPj4+IDYpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBidWZbaSsrXSA9IDB4ZjAgfCAoYyA+Pj4gMTgpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDEyICYgMHgzZik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmO1xufTtcblxuLy8gSGVscGVyICh1c2VkIGluIDIgcGxhY2VzKVxuZnVuY3Rpb24gYnVmMmJpbnN0cmluZyhidWYsIGxlbikge1xuICAvLyBPbiBDaHJvbWUsIHRoZSBhcmd1bWVudHMgaW4gYSBmdW5jdGlvbiBjYWxsIHRoYXQgYXJlIGFsbG93ZWQgaXMgYDY1NTM0YC5cbiAgLy8gSWYgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiB0aGF0LCB3ZSBjYW4gdXNlIHRoaXMgb3B0aW1pemF0aW9uLFxuICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCB0YWtlIGEgc2xvd2VyIHBhdGguXG4gIGlmIChsZW4gPCA2NTUzNCkge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIFZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgYnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/utils/strings.js\n");
73
+
74
+ /***/ }),
75
+
76
+ /***/ "../../../node_modules/pako/lib/zlib/adler32.js":
77
+ /*!******************************************************!*\
78
+ !*** ../../../node_modules/pako/lib/zlib/adler32.js ***!
79
+ \******************************************************/
80
+ /***/ ((module) => {
81
+
82
+ "use strict";
83
+ eval("\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n var s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanM/ZjNiNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGlzbid0IHdvcnRoIGl0IHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/adler32.js\n");
84
+
85
+ /***/ }),
86
+
87
+ /***/ "../../../node_modules/pako/lib/zlib/constants.js":
88
+ /*!********************************************************!*\
89
+ !*** ../../../node_modules/pako/lib/zlib/constants.js ***!
90
+ \********************************************************/
91
+ /***/ ((module) => {
92
+
93
+ "use strict";
94
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n //Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2NvbnN0YW50cy5qcz9iNDZhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBhbmQgaW5mbGF0ZSgpIGJlbG93IGZvciBkZXRhaWxzICovXG4gIFpfTk9fRkxVU0g6ICAgICAgICAgMCxcbiAgWl9QQVJUSUFMX0ZMVVNIOiAgICAxLFxuICBaX1NZTkNfRkxVU0g6ICAgICAgIDIsXG4gIFpfRlVMTF9GTFVTSDogICAgICAgMyxcbiAgWl9GSU5JU0g6ICAgICAgICAgICA0LFxuICBaX0JMT0NLOiAgICAgICAgICAgIDUsXG4gIFpfVFJFRVM6ICAgICAgICAgICAgNixcblxuICAvKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICAqL1xuICBaX09LOiAgICAgICAgICAgICAgIDAsXG4gIFpfU1RSRUFNX0VORDogICAgICAgMSxcbiAgWl9ORUVEX0RJQ1Q6ICAgICAgICAyLFxuICBaX0VSUk5POiAgICAgICAgICAgLTEsXG4gIFpfU1RSRUFNX0VSUk9SOiAgICAtMixcbiAgWl9EQVRBX0VSUk9SOiAgICAgIC0zLFxuICAvL1pfTUVNX0VSUk9SOiAgICAgLTQsXG4gIFpfQlVGX0VSUk9SOiAgICAgICAtNSxcbiAgLy9aX1ZFUlNJT05fRVJST1I6IC02LFxuXG4gIC8qIGNvbXByZXNzaW9uIGxldmVscyAqL1xuICBaX05PX0NPTVBSRVNTSU9OOiAgICAgICAgIDAsXG4gIFpfQkVTVF9TUEVFRDogICAgICAgICAgICAgMSxcbiAgWl9CRVNUX0NPTVBSRVNTSU9OOiAgICAgICA5LFxuICBaX0RFRkFVTFRfQ09NUFJFU1NJT046ICAgLTEsXG5cblxuICBaX0ZJTFRFUkVEOiAgICAgICAgICAgICAgIDEsXG4gIFpfSFVGRk1BTl9PTkxZOiAgICAgICAgICAgMixcbiAgWl9STEU6ICAgICAgICAgICAgICAgICAgICAzLFxuICBaX0ZJWEVEOiAgICAgICAgICAgICAgICAgIDQsXG4gIFpfREVGQVVMVF9TVFJBVEVHWTogICAgICAgMCxcblxuICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGRhdGFfdHlwZSBmaWVsZCAodGhvdWdoIHNlZSBpbmZsYXRlKCkpICovXG4gIFpfQklOQVJZOiAgICAgICAgICAgICAgICAgMCxcbiAgWl9URVhUOiAgICAgICAgICAgICAgICAgICAxLFxuICAvL1pfQVNDSUk6ICAgICAgICAgICAgICAgIDEsIC8vID0gWl9URVhUIChkZXByZWNhdGVkKVxuICBaX1VOS05PV046ICAgICAgICAgICAgICAgIDIsXG5cbiAgLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG4gIFpfREVGTEFURUQ6ICAgICAgICAgICAgICAgOFxuICAvL1pfTlVMTDogICAgICAgICAgICAgICAgIG51bGwgLy8gVXNlIC0xIG9yIG51bGwgaW5saW5lLCBkZXBlbmRpbmcgb24gdmFyIHR5cGVcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/constants.js\n");
95
+
96
+ /***/ }),
97
+
98
+ /***/ "../../../node_modules/pako/lib/zlib/crc32.js":
99
+ /*!****************************************************!*\
100
+ !*** ../../../node_modules/pako/lib/zlib/crc32.js ***!
101
+ \****************************************************/
102
+ /***/ ((module) => {
103
+
104
+ "use strict";
105
+ eval("\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n var c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n var t = crcTable,\n end = pos + len;\n\n crc ^= -1;\n\n for (var i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUEsdUJBQXVCO0FBQ3ZCOzs7QUFHQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcz9jNjY4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/crc32.js\n");
106
+
107
+ /***/ }),
108
+
109
+ /***/ "../../../node_modules/pako/lib/zlib/deflate.js":
110
+ /*!******************************************************!*\
111
+ !*** ../../../node_modules/pako/lib/zlib/deflate.js ***!
112
+ \******************************************************/
113
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
114
+
115
+ "use strict";
116
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = __webpack_require__(/*! ../utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\nvar trees = __webpack_require__(/*! ./trees */ \"../../../node_modules/pako/lib/zlib/trees.js\");\nvar adler32 = __webpack_require__(/*! ./adler32 */ \"../../../node_modules/pako/lib/zlib/adler32.js\");\nvar crc32 = __webpack_require__(/*! ./crc32 */ \"../../../node_modules/pako/lib/zlib/crc32.js\");\nvar msg = __webpack_require__(/*! ./messages */ \"../../../node_modules/pako/lib/zlib/messages.js\");\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\nvar Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\n//var Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\n//var Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\n//var Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION = 0;\n//var Z_BEST_SPEED = 1;\n//var Z_BEST_COMPRESSION = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED = 1;\nvar Z_HUFFMAN_ONLY = 2;\nvar Z_RLE = 3;\nvar Z_FIXED = 4;\nvar Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY = 0;\n//var Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES = 30;\n/* number of distance codes */\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n strm.msg = msg[errorCode];\n return errorCode;\n}\n\nfunction rank(f) {\n return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n var s = strm.state;\n\n //_tr_flush_bits(s);\n var len = s.pending;\n if (len > strm.avail_out) {\n len = strm.avail_out;\n }\n if (len === 0) { return; }\n\n utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n strm.next_out += len;\n s.pending_out += len;\n strm.total_out += len;\n strm.avail_out -= len;\n s.pending -= len;\n if (s.pending === 0) {\n s.pending_out = 0;\n }\n}\n\n\nfunction flush_block_only(s, last) {\n trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n s.block_start = s.strstart;\n flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n// put_byte(s, (Byte)(b >> 8));\n// put_byte(s, (Byte)(b & 0xff));\n s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read. All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n var len = strm.avail_in;\n\n if (len > size) { len = size; }\n if (len === 0) { return 0; }\n\n strm.avail_in -= len;\n\n // zmemcpy(buf, strm->next_in, len);\n utils.arraySet(buf, strm.input, strm.next_in, len, start);\n if (strm.state.wrap === 1) {\n strm.adler = adler32(strm.adler, buf, len, start);\n }\n\n else if (strm.state.wrap === 2) {\n strm.adler = crc32(strm.adler, buf, len, start);\n }\n\n strm.next_in += len;\n strm.total_in += len;\n\n return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n var chain_length = s.max_chain_length; /* max hash chain length */\n var scan = s.strstart; /* current string */\n var match; /* matched string */\n var len; /* length of current match */\n var best_len = s.prev_length; /* best match length so far */\n var nice_match = s.nice_match; /* stop if match long enough */\n var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n var _win = s.window; // shortcut\n\n var wmask = s.w_mask;\n var prev = s.prev;\n\n /* Stop when cur_match becomes <= limit. To simplify the code,\n * we prevent matches with the string of window index 0.\n */\n\n var strend = s.strstart + MAX_MATCH;\n var scan_end1 = _win[scan + best_len - 1];\n var scan_end = _win[scan + best_len];\n\n /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n * It is easy to get rid of this optimization if necessary.\n */\n // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n /* Do not waste too much time if we already have a good match: */\n if (s.prev_length >= s.good_match) {\n chain_length >>= 2;\n }\n /* Do not look for matches beyond the end of the input. This is necessary\n * to make deflate deterministic.\n */\n if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n do {\n // Assert(cur_match < s->strstart, \"no future\");\n match = cur_match;\n\n /* Skip to next match if the match length cannot increase\n * or if the match length is less than 2. Note that the checks below\n * for insufficient lookahead only occur occasionally for performance\n * reasons. Therefore uninitialized memory will be accessed, and\n * conditional jumps will be made that depend on those values.\n * However the length of the match is limited to the lookahead, so\n * the output of deflate is not affected by the uninitialized values.\n */\n\n if (_win[match + best_len] !== scan_end ||\n _win[match + best_len - 1] !== scan_end1 ||\n _win[match] !== _win[scan] ||\n _win[++match] !== _win[scan + 1]) {\n continue;\n }\n\n /* The check at best_len-1 can be removed because it will be made\n * again later. (This heuristic is not always a win.)\n * It is not necessary to compare scan[2] and match[2] since they\n * are always equal when the other bytes match, given that\n * the hash keys are equal and that HASH_BITS >= 8.\n */\n scan += 2;\n match++;\n // Assert(*scan == *match, \"match[2]?\");\n\n /* We check for insufficient lookahead only every 8th comparison;\n * the 256th check will be made at strstart+258.\n */\n do {\n /*jshint noempty:false*/\n } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n scan < strend);\n\n // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n len = MAX_MATCH - (strend - scan);\n scan = strend - MAX_MATCH;\n\n if (len > best_len) {\n s.match_start = cur_match;\n best_len = len;\n if (len >= nice_match) {\n break;\n }\n scan_end1 = _win[scan + best_len - 1];\n scan_end = _win[scan + best_len];\n }\n } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n if (best_len <= s.lookahead) {\n return best_len;\n }\n return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n * At least one byte has been read, or avail_in == 0; reads are\n * performed for at least two bytes (required for the zip translate_eol\n * option -- not supported here).\n */\nfunction fill_window(s) {\n var _w_size = s.w_size;\n var p, n, m, more, str;\n\n //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n do {\n more = s.window_size - s.lookahead - s.strstart;\n\n // JS ints have 32 bit, block below not needed\n /* Deal with !@#$% 64K limit: */\n //if (sizeof(int) <= 2) {\n // if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n // more = wsize;\n //\n // } else if (more == (unsigned)(-1)) {\n // /* Very unlikely, but possible on 16 bit machine if\n // * strstart == 0 && lookahead == 1 (input done a byte at time)\n // */\n // more--;\n // }\n //}\n\n\n /* If the window is almost full and there is insufficient lookahead,\n * move the upper half to the lower one to make room in the upper half.\n */\n if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n s.match_start -= _w_size;\n s.strstart -= _w_size;\n /* we now have strstart >= MAX_DIST */\n s.block_start -= _w_size;\n\n /* Slide the hash table (could be avoided with 32 bit values\n at the expense of memory usage). We slide even when level == 0\n to keep the hash table consistent if we switch back to level > 0\n later. (Using level 0 permanently is not an optimal usage of\n zlib, so we don't care about this pathological case.)\n */\n\n n = s.hash_size;\n p = n;\n do {\n m = s.head[--p];\n s.head[p] = (m >= _w_size ? m - _w_size : 0);\n } while (--n);\n\n n = _w_size;\n p = n;\n do {\n m = s.prev[--p];\n s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n /* If n is not on any hash chain, prev[n] is garbage but\n * its value will never be used.\n */\n } while (--n);\n\n more += _w_size;\n }\n if (s.strm.avail_in === 0) {\n break;\n }\n\n /* If there was no sliding:\n * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n * more == window_size - lookahead - strstart\n * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n * => more >= window_size - 2*WSIZE + 2\n * In the BIG_MEM or MMAP case (not yet supported),\n * window_size == input_size + MIN_LOOKAHEAD &&\n * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n * Otherwise, window_size == 2*WSIZE so more >= 2.\n * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n */\n //Assert(more >= 2, \"more < 2\");\n n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n s.lookahead += n;\n\n /* Initialize the hash value now that we have some input: */\n if (s.lookahead + s.insert >= MIN_MATCH) {\n str = s.strstart - s.insert;\n s.ins_h = s.window[str];\n\n /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n// Call update_hash() MIN_MATCH-3 more times\n//#endif\n while (s.insert) {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = str;\n str++;\n s.insert--;\n if (s.lookahead + s.insert < MIN_MATCH) {\n break;\n }\n }\n }\n /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n * but this is not important since only literal bytes will be emitted.\n */\n\n } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n /* If the WIN_INIT bytes after the end of the current data have never been\n * written, then zero those bytes in order to avoid memory check reports of\n * the use of uninitialized (or uninitialised as Julian writes) bytes by\n * the longest match routines. Update the high water mark for the next\n * time through here. WIN_INIT is set to MAX_MATCH since the longest match\n * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n */\n// if (s.high_water < s.window_size) {\n// var curr = s.strstart + s.lookahead;\n// var init = 0;\n//\n// if (s.high_water < curr) {\n// /* Previous high water mark below current data -- zero WIN_INIT\n// * bytes or up to end of window, whichever is less.\n// */\n// init = s.window_size - curr;\n// if (init > WIN_INIT)\n// init = WIN_INIT;\n// zmemzero(s->window + curr, (unsigned)init);\n// s->high_water = curr + init;\n// }\n// else if (s->high_water < (ulg)curr + WIN_INIT) {\n// /* High water mark at or above current data, but below current data\n// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n// * to end of window, whichever is less.\n// */\n// init = (ulg)curr + WIN_INIT - s->high_water;\n// if (init > s->window_size - s->high_water)\n// init = s->window_size - s->high_water;\n// zmemzero(s->window + s->high_water, (unsigned)init);\n// s->high_water += init;\n// }\n// }\n//\n// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n// \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n * to pending_buf_size, and each stored block has a 5 byte header:\n */\n var max_block_size = 0xffff;\n\n if (max_block_size > s.pending_buf_size - 5) {\n max_block_size = s.pending_buf_size - 5;\n }\n\n /* Copy as much as possible from input to output: */\n for (;;) {\n /* Fill the window as much as possible: */\n if (s.lookahead <= 1) {\n\n //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n // s->block_start >= (long)s->w_size, \"slide too late\");\n// if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n// s.block_start >= s.w_size)) {\n// throw new Error(\"slide too late\");\n// }\n\n fill_window(s);\n if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n\n if (s.lookahead === 0) {\n break;\n }\n /* flush the current block */\n }\n //Assert(s->block_start >= 0L, \"block gone\");\n// if (s.block_start < 0) throw new Error(\"block gone\");\n\n s.strstart += s.lookahead;\n s.lookahead = 0;\n\n /* Emit a stored block if pending_buf will be full: */\n var max_start = s.block_start + max_block_size;\n\n if (s.strstart === 0 || s.strstart >= max_start) {\n /* strstart == 0 is possible when wraparound on 16-bit machine */\n s.lookahead = s.strstart - max_start;\n s.strstart = max_start;\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n\n\n }\n /* Flush if we may have to slide, otherwise block_start may become\n * negative and the data will be gone:\n */\n if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n\n s.insert = 0;\n\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n\n if (s.strstart > s.block_start) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n var hash_head; /* head of the hash chain */\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) {\n break; /* flush the current block */\n }\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n * At this point we have always match_length < MIN_MATCH\n */\n if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n }\n if (s.match_length >= MIN_MATCH) {\n // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n /*** _tr_tally_dist(s, s.strstart - s.match_start,\n s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n\n /* Insert new strings in the hash table only if the match length\n * is not too large. This saves time but degrades compression.\n */\n if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n s.match_length--; /* string at strstart already in table */\n do {\n s.strstart++;\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n * always MIN_MATCH bytes ahead.\n */\n } while (--s.match_length !== 0);\n s.strstart++;\n } else\n {\n s.strstart += s.match_length;\n s.match_length = 0;\n s.ins_h = s.window[s.strstart];\n /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n// Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n * matter since it will be recomputed at next deflate call.\n */\n }\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n var hash_head; /* head of hash chain */\n var bflush; /* set if current block must be flushed */\n\n var max_insert;\n\n /* Process the input block. */\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the next match, plus MIN_MATCH bytes to insert the\n * string following the next match.\n */\n if (s.lookahead < MIN_LOOKAHEAD) {\n fill_window(s);\n if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* Insert the string window[strstart .. strstart+2] in the\n * dictionary, and set hash_head to the head of the hash chain:\n */\n hash_head = 0/*NIL*/;\n if (s.lookahead >= MIN_MATCH) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n\n /* Find the longest match, discarding those <= prev_length.\n */\n s.prev_length = s.match_length;\n s.prev_match = s.match_start;\n s.match_length = MIN_MATCH - 1;\n\n if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n /* To simplify the code, we prevent matches with the string\n * of window index 0 (in particular we have to avoid a match\n * of the string with itself at the start of the input file).\n */\n s.match_length = longest_match(s, hash_head);\n /* longest_match() sets match_start */\n\n if (s.match_length <= 5 &&\n (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n /* If prev_match is also MIN_MATCH, match_start is garbage\n * but we will ignore the current match anyway.\n */\n s.match_length = MIN_MATCH - 1;\n }\n }\n /* If there was a match at the previous step and the current\n * match is not better, output the previous match:\n */\n if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n max_insert = s.strstart + s.lookahead - MIN_MATCH;\n /* Do not insert strings in hash table beyond this. */\n\n //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n s.prev_length - MIN_MATCH, bflush);***/\n bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n /* Insert in hash table all strings up to the end of the match.\n * strstart-1 and strstart are already inserted. If there is not\n * enough lookahead, the last two strings are not inserted in\n * the hash table.\n */\n s.lookahead -= s.prev_length - 1;\n s.prev_length -= 2;\n do {\n if (++s.strstart <= max_insert) {\n /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n s.head[s.ins_h] = s.strstart;\n /***/\n }\n } while (--s.prev_length !== 0);\n s.match_available = 0;\n s.match_length = MIN_MATCH - 1;\n s.strstart++;\n\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n } else if (s.match_available) {\n /* If there was no match at the previous position, output a\n * single literal. If there was a match but the current match\n * is longer, truncate the previous match to a single literal.\n */\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n if (bflush) {\n /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n flush_block_only(s, false);\n /***/\n }\n s.strstart++;\n s.lookahead--;\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n } else {\n /* There is no previous match to compare with, wait for\n * the next step to decide.\n */\n s.match_available = 1;\n s.strstart++;\n s.lookahead--;\n }\n }\n //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n if (s.match_available) {\n //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n s.match_available = 0;\n }\n s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n\n return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one. Do not maintain a hash table. (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n var bflush; /* set if current block must be flushed */\n var prev; /* byte at distance one to match */\n var scan, strend; /* scan goes up to strend for length of run */\n\n var _win = s.window;\n\n for (;;) {\n /* Make sure that we always have enough lookahead, except\n * at the end of the input file. We need MAX_MATCH bytes\n * for the longest run, plus one for the unrolled loop.\n */\n if (s.lookahead <= MAX_MATCH) {\n fill_window(s);\n if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n if (s.lookahead === 0) { break; } /* flush the current block */\n }\n\n /* See how many times the previous byte repeats */\n s.match_length = 0;\n if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n scan = s.strstart - 1;\n prev = _win[scan];\n if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n strend = s.strstart + MAX_MATCH;\n do {\n /*jshint noempty:false*/\n } while (prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n prev === _win[++scan] && prev === _win[++scan] &&\n scan < strend);\n s.match_length = MAX_MATCH - (strend - scan);\n if (s.match_length > s.lookahead) {\n s.match_length = s.lookahead;\n }\n }\n //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n }\n\n /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n if (s.match_length >= MIN_MATCH) {\n //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n s.lookahead -= s.match_length;\n s.strstart += s.match_length;\n s.match_length = 0;\n } else {\n /* No match, output a literal byte */\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n s.lookahead--;\n s.strstart++;\n }\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n var bflush; /* set if current block must be flushed */\n\n for (;;) {\n /* Make sure that we have a literal to write. */\n if (s.lookahead === 0) {\n fill_window(s);\n if (s.lookahead === 0) {\n if (flush === Z_NO_FLUSH) {\n return BS_NEED_MORE;\n }\n break; /* flush the current block */\n }\n }\n\n /* Output a literal byte */\n s.match_length = 0;\n //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n s.lookahead--;\n s.strstart++;\n if (bflush) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n }\n s.insert = 0;\n if (flush === Z_FINISH) {\n /*** FLUSH_BLOCK(s, 1); ***/\n flush_block_only(s, true);\n if (s.strm.avail_out === 0) {\n return BS_FINISH_STARTED;\n }\n /***/\n return BS_FINISH_DONE;\n }\n if (s.last_lit) {\n /*** FLUSH_BLOCK(s, 0); ***/\n flush_block_only(s, false);\n if (s.strm.avail_out === 0) {\n return BS_NEED_MORE;\n }\n /***/\n }\n return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n this.good_length = good_length;\n this.max_lazy = max_lazy;\n this.nice_length = nice_length;\n this.max_chain = max_chain;\n this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n /* good lazy nice chain */\n new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */\n new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */\n new Config(4, 5, 16, 8, deflate_fast), /* 2 */\n new Config(4, 6, 32, 32, deflate_fast), /* 3 */\n\n new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */\n new Config(8, 16, 32, 32, deflate_slow), /* 5 */\n new Config(8, 16, 128, 128, deflate_slow), /* 6 */\n new Config(8, 32, 128, 256, deflate_slow), /* 7 */\n new Config(32, 128, 258, 1024, deflate_slow), /* 8 */\n new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n s.window_size = 2 * s.w_size;\n\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n\n /* Set the default configuration parameters:\n */\n s.max_lazy_match = configuration_table[s.level].max_lazy;\n s.good_match = configuration_table[s.level].good_length;\n s.nice_match = configuration_table[s.level].nice_length;\n s.max_chain_length = configuration_table[s.level].max_chain;\n\n s.strstart = 0;\n s.block_start = 0;\n s.lookahead = 0;\n s.insert = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n this.strm = null; /* pointer back to this zlib stream */\n this.status = 0; /* as the name implies */\n this.pending_buf = null; /* output still pending */\n this.pending_buf_size = 0; /* size of pending_buf */\n this.pending_out = 0; /* next pending byte to output to the stream */\n this.pending = 0; /* nb of bytes in the pending buffer */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.gzhead = null; /* gzip header information to write */\n this.gzindex = 0; /* where in extra, name, or comment */\n this.method = Z_DEFLATED; /* can only be DEFLATED */\n this.last_flush = -1; /* value of flush param for previous deflate call */\n\n this.w_size = 0; /* LZ77 window size (32K by default) */\n this.w_bits = 0; /* log2(w_size) (8..16) */\n this.w_mask = 0; /* w_size - 1 */\n\n this.window = null;\n /* Sliding window. Input bytes are read into the second half of the window,\n * and move to the first half later to keep a dictionary of at least wSize\n * bytes. With this organization, matches are limited to a distance of\n * wSize-MAX_MATCH bytes, but this ensures that IO is always\n * performed with a length multiple of the block size.\n */\n\n this.window_size = 0;\n /* Actual size of window: 2*wSize, except when the user input buffer\n * is directly used as sliding window.\n */\n\n this.prev = null;\n /* Link to older string with same hash index. To limit the size of this\n * array to 64K, this link is maintained only for the last 32K strings.\n * An index in this array is thus a window index modulo 32K.\n */\n\n this.head = null; /* Heads of the hash chains or NIL. */\n\n this.ins_h = 0; /* hash index of string to be inserted */\n this.hash_size = 0; /* number of elements in hash table */\n this.hash_bits = 0; /* log2(hash_size) */\n this.hash_mask = 0; /* hash_size-1 */\n\n this.hash_shift = 0;\n /* Number of bits by which ins_h must be shifted at each input\n * step. It must be such that after MIN_MATCH steps, the oldest\n * byte no longer takes part in the hash key, that is:\n * hash_shift * MIN_MATCH >= hash_bits\n */\n\n this.block_start = 0;\n /* Window position at the beginning of the current output block. Gets\n * negative when the window is moved backwards.\n */\n\n this.match_length = 0; /* length of best match */\n this.prev_match = 0; /* previous match */\n this.match_available = 0; /* set if previous match exists */\n this.strstart = 0; /* start of string to insert */\n this.match_start = 0; /* start of matching string */\n this.lookahead = 0; /* number of valid bytes ahead in window */\n\n this.prev_length = 0;\n /* Length of the best match at previous step. Matches not greater than this\n * are discarded. This is used in the lazy match evaluation.\n */\n\n this.max_chain_length = 0;\n /* To speed up deflation, hash chains are never searched beyond this\n * length. A higher limit improves compression ratio but degrades the\n * speed.\n */\n\n this.max_lazy_match = 0;\n /* Attempt to find a better match only when the current match is strictly\n * smaller than this value. This mechanism is used only for compression\n * levels >= 4.\n */\n // That's alias to max_lazy_match, don't use directly\n //this.max_insert_length = 0;\n /* Insert new strings in the hash table only if the match length is not\n * greater than this length. This saves time but degrades compression.\n * max_insert_length is used only for compression levels <= 3.\n */\n\n this.level = 0; /* compression level (1..9) */\n this.strategy = 0; /* favor or force Huffman coding*/\n\n this.good_match = 0;\n /* Use a faster search when the previous match is longer than this */\n\n this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n /* used by trees.c: */\n\n /* Didn't use ct_data typedef below to suppress compiler warning */\n\n // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */\n // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */\n\n // Use flat array of DOUBLE size, with interleaved fata,\n // because JS does not support effective\n this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);\n this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2);\n this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2);\n zero(this.dyn_ltree);\n zero(this.dyn_dtree);\n zero(this.bl_tree);\n\n this.l_desc = null; /* desc. for literal tree */\n this.d_desc = null; /* desc. for distance tree */\n this.bl_desc = null; /* desc. for bit length tree */\n\n //ush bl_count[MAX_BITS+1];\n this.bl_count = new utils.Buf16(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */\n this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */\n zero(this.heap);\n\n this.heap_len = 0; /* number of elements in the heap */\n this.heap_max = 0; /* element of largest frequency */\n /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n * The same heap array is used to build all trees.\n */\n\n this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n zero(this.depth);\n /* Depth of each subtree used as tie breaker for trees of equal frequency\n */\n\n this.l_buf = 0; /* buffer index for literals or lengths */\n\n this.lit_bufsize = 0;\n /* Size of match buffer for literals/lengths. There are 4 reasons for\n * limiting lit_bufsize to 64K:\n * - frequencies can be kept in 16 bit counters\n * - if compression is not successful for the first block, all input\n * data is still in the window so we can still emit a stored block even\n * when input comes from standard input. (This can also be done for\n * all blocks if lit_bufsize is not greater than 32K.)\n * - if compression is not successful for a file smaller than 64K, we can\n * even emit a stored file instead of a stored block (saving 5 bytes).\n * This is applicable only for zip (not gzip or zlib).\n * - creating new Huffman trees less frequently may not provide fast\n * adaptation to changes in the input data statistics. (Take for\n * example a binary file with poorly compressible code followed by\n * a highly compressible string table.) Smaller buffer sizes give\n * fast adaptation but have of course the overhead of transmitting\n * trees more frequently.\n * - I can't count above 4\n */\n\n this.last_lit = 0; /* running index in l_buf */\n\n this.d_buf = 0;\n /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n * the same number of elements. To use different lengths, an extra flag\n * array would be necessary.\n */\n\n this.opt_len = 0; /* bit length of current block with optimal trees */\n this.static_len = 0; /* bit length of current block with static trees */\n this.matches = 0; /* number of string matches in current block */\n this.insert = 0; /* bytes at end of window left to insert */\n\n\n this.bi_buf = 0;\n /* Output buffer. bits are inserted starting at the bottom (least\n * significant bits).\n */\n this.bi_valid = 0;\n /* Number of valid bits in bi_buf. All bits above the last valid bit\n * are always zero.\n */\n\n // Used for window memory init. We safely ignore it for JS. That makes\n // sense only for pointers and memory check tools.\n //this.high_water = 0;\n /* High water mark offset in window for initialized bytes -- bytes above\n * this are set to zero in order to avoid memory check warnings when\n * longest match routines access bytes past the input. This is then\n * updated to the new high water mark.\n */\n}\n\n\nfunction deflateResetKeep(strm) {\n var s;\n\n if (!strm || !strm.state) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.total_in = strm.total_out = 0;\n strm.data_type = Z_UNKNOWN;\n\n s = strm.state;\n s.pending = 0;\n s.pending_out = 0;\n\n if (s.wrap < 0) {\n s.wrap = -s.wrap;\n /* was made negative by deflate(..., Z_FINISH); */\n }\n s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n strm.adler = (s.wrap === 2) ?\n 0 // crc32(0, Z_NULL, 0)\n :\n 1; // adler32(0, Z_NULL, 0)\n s.last_flush = Z_NO_FLUSH;\n trees._tr_init(s);\n return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n var ret = deflateResetKeep(strm);\n if (ret === Z_OK) {\n lm_init(strm.state);\n }\n return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n strm.state.gzhead = head;\n return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n if (!strm) { // === Z_NULL\n return Z_STREAM_ERROR;\n }\n var wrap = 1;\n\n if (level === Z_DEFAULT_COMPRESSION) {\n level = 6;\n }\n\n if (windowBits < 0) { /* suppress zlib wrapper */\n wrap = 0;\n windowBits = -windowBits;\n }\n\n else if (windowBits > 15) {\n wrap = 2; /* write gzip wrapper instead */\n windowBits -= 16;\n }\n\n\n if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n strategy < 0 || strategy > Z_FIXED) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n\n if (windowBits === 8) {\n windowBits = 9;\n }\n /* until 256-byte window bug fixed */\n\n var s = new DeflateState();\n\n strm.state = s;\n s.strm = strm;\n\n s.wrap = wrap;\n s.gzhead = null;\n s.w_bits = windowBits;\n s.w_size = 1 << s.w_bits;\n s.w_mask = s.w_size - 1;\n\n s.hash_bits = memLevel + 7;\n s.hash_size = 1 << s.hash_bits;\n s.hash_mask = s.hash_size - 1;\n s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n s.window = new utils.Buf8(s.w_size * 2);\n s.head = new utils.Buf16(s.hash_size);\n s.prev = new utils.Buf16(s.w_size);\n\n // Don't need mem init magic for JS.\n //s.high_water = 0; /* nothing written to s->window yet */\n\n s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n s.pending_buf_size = s.lit_bufsize * 4;\n\n //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n //s->pending_buf = (uchf *) overlay;\n s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n s.d_buf = 1 * s.lit_bufsize;\n\n //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n s.l_buf = (1 + 2) * s.lit_bufsize;\n\n s.level = level;\n s.strategy = strategy;\n s.method = method;\n\n return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n var old_flush, s;\n var beg, val; // for gzip header write only\n\n if (!strm || !strm.state ||\n flush > Z_BLOCK || flush < 0) {\n return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n }\n\n s = strm.state;\n\n if (!strm.output ||\n (!strm.input && strm.avail_in !== 0) ||\n (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n }\n\n s.strm = strm; /* just in case */\n old_flush = s.last_flush;\n s.last_flush = flush;\n\n /* Write the header */\n if (s.status === INIT_STATE) {\n\n if (s.wrap === 2) { // GZIP header\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n put_byte(s, 31);\n put_byte(s, 139);\n put_byte(s, 8);\n if (!s.gzhead) { // s->gzhead == Z_NULL\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, 0);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, OS_CODE);\n s.status = BUSY_STATE;\n }\n else {\n put_byte(s, (s.gzhead.text ? 1 : 0) +\n (s.gzhead.hcrc ? 2 : 0) +\n (!s.gzhead.extra ? 0 : 4) +\n (!s.gzhead.name ? 0 : 8) +\n (!s.gzhead.comment ? 0 : 16)\n );\n put_byte(s, s.gzhead.time & 0xff);\n put_byte(s, (s.gzhead.time >> 8) & 0xff);\n put_byte(s, (s.gzhead.time >> 16) & 0xff);\n put_byte(s, (s.gzhead.time >> 24) & 0xff);\n put_byte(s, s.level === 9 ? 2 :\n (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n 4 : 0));\n put_byte(s, s.gzhead.os & 0xff);\n if (s.gzhead.extra && s.gzhead.extra.length) {\n put_byte(s, s.gzhead.extra.length & 0xff);\n put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n }\n if (s.gzhead.hcrc) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n }\n s.gzindex = 0;\n s.status = EXTRA_STATE;\n }\n }\n else // DEFLATE header\n {\n var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n var level_flags = -1;\n\n if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n level_flags = 0;\n } else if (s.level < 6) {\n level_flags = 1;\n } else if (s.level === 6) {\n level_flags = 2;\n } else {\n level_flags = 3;\n }\n header |= (level_flags << 6);\n if (s.strstart !== 0) { header |= PRESET_DICT; }\n header += 31 - (header % 31);\n\n s.status = BUSY_STATE;\n putShortMSB(s, header);\n\n /* Save the adler32 of the preset dictionary: */\n if (s.strstart !== 0) {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n strm.adler = 1; // adler32(0L, Z_NULL, 0);\n }\n }\n\n//#ifdef GZIP\n if (s.status === EXTRA_STATE) {\n if (s.gzhead.extra/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n\n while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n break;\n }\n }\n put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n s.gzindex++;\n }\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (s.gzindex === s.gzhead.extra.length) {\n s.gzindex = 0;\n s.status = NAME_STATE;\n }\n }\n else {\n s.status = NAME_STATE;\n }\n }\n if (s.status === NAME_STATE) {\n if (s.gzhead.name/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.name.length) {\n val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.gzindex = 0;\n s.status = COMMENT_STATE;\n }\n }\n else {\n s.status = COMMENT_STATE;\n }\n }\n if (s.status === COMMENT_STATE) {\n if (s.gzhead.comment/* != Z_NULL*/) {\n beg = s.pending; /* start of bytes to update crc */\n //int val;\n\n do {\n if (s.pending === s.pending_buf_size) {\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n flush_pending(strm);\n beg = s.pending;\n if (s.pending === s.pending_buf_size) {\n val = 1;\n break;\n }\n }\n // JS specific: little magic to add zero terminator to end of string\n if (s.gzindex < s.gzhead.comment.length) {\n val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n } else {\n val = 0;\n }\n put_byte(s, val);\n } while (val !== 0);\n\n if (s.gzhead.hcrc && s.pending > beg) {\n strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n }\n if (val === 0) {\n s.status = HCRC_STATE;\n }\n }\n else {\n s.status = HCRC_STATE;\n }\n }\n if (s.status === HCRC_STATE) {\n if (s.gzhead.hcrc) {\n if (s.pending + 2 > s.pending_buf_size) {\n flush_pending(strm);\n }\n if (s.pending + 2 <= s.pending_buf_size) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n strm.adler = 0; //crc32(0L, Z_NULL, 0);\n s.status = BUSY_STATE;\n }\n }\n else {\n s.status = BUSY_STATE;\n }\n }\n//#endif\n\n /* Flush as much pending output as possible */\n if (s.pending !== 0) {\n flush_pending(strm);\n if (strm.avail_out === 0) {\n /* Since avail_out is 0, deflate will be called again with\n * more output space, but possibly with both pending and\n * avail_in equal to zero. There won't be anything to do,\n * but this is not an error situation so make sure we\n * return OK instead of BUF_ERROR at next call of deflate:\n */\n s.last_flush = -1;\n return Z_OK;\n }\n\n /* Make sure there is something to do and avoid duplicate consecutive\n * flushes. For repeated and useless calls with Z_FINISH, we keep\n * returning Z_STREAM_END instead of Z_BUF_ERROR.\n */\n } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n flush !== Z_FINISH) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* User must not provide more input after the first FINISH: */\n if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n return err(strm, Z_BUF_ERROR);\n }\n\n /* Start a new block or continue the current one.\n */\n if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n configuration_table[s.level].func(s, flush));\n\n if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n s.status = FINISH_STATE;\n }\n if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n if (strm.avail_out === 0) {\n s.last_flush = -1;\n /* avoid BUF_ERROR next call, see above */\n }\n return Z_OK;\n /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n * of deflate should use the same flush parameter to make sure\n * that the flush is complete. So we don't have to output an\n * empty block here, this will be done at next call. This also\n * ensures that for a very small output buffer, we emit at most\n * one empty block.\n */\n }\n if (bstate === BS_BLOCK_DONE) {\n if (flush === Z_PARTIAL_FLUSH) {\n trees._tr_align(s);\n }\n else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n trees._tr_stored_block(s, 0, 0, false);\n /* For a full flush, this empty block will be recognized\n * as a special marker by inflate_sync().\n */\n if (flush === Z_FULL_FLUSH) {\n /*** CLEAR_HASH(s); ***/ /* forget history */\n zero(s.head); // Fill with NIL (= 0);\n\n if (s.lookahead === 0) {\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n }\n }\n flush_pending(strm);\n if (strm.avail_out === 0) {\n s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n return Z_OK;\n }\n }\n }\n //Assert(strm->avail_out > 0, \"bug2\");\n //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n if (flush !== Z_FINISH) { return Z_OK; }\n if (s.wrap <= 0) { return Z_STREAM_END; }\n\n /* Write the trailer */\n if (s.wrap === 2) {\n put_byte(s, strm.adler & 0xff);\n put_byte(s, (strm.adler >> 8) & 0xff);\n put_byte(s, (strm.adler >> 16) & 0xff);\n put_byte(s, (strm.adler >> 24) & 0xff);\n put_byte(s, strm.total_in & 0xff);\n put_byte(s, (strm.total_in >> 8) & 0xff);\n put_byte(s, (strm.total_in >> 16) & 0xff);\n put_byte(s, (strm.total_in >> 24) & 0xff);\n }\n else\n {\n putShortMSB(s, strm.adler >>> 16);\n putShortMSB(s, strm.adler & 0xffff);\n }\n\n flush_pending(strm);\n /* If avail_out is zero, the application will call deflate again\n * to flush the rest.\n */\n if (s.wrap > 0) { s.wrap = -s.wrap; }\n /* write the trailer only once! */\n return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n var status;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n status = strm.state.status;\n if (status !== INIT_STATE &&\n status !== EXTRA_STATE &&\n status !== NAME_STATE &&\n status !== COMMENT_STATE &&\n status !== HCRC_STATE &&\n status !== BUSY_STATE &&\n status !== FINISH_STATE\n ) {\n return err(strm, Z_STREAM_ERROR);\n }\n\n strm.state = null;\n\n return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var s;\n var str, n;\n var wrap;\n var avail;\n var next;\n var input;\n var tmpDict;\n\n if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n return Z_STREAM_ERROR;\n }\n\n s = strm.state;\n wrap = s.wrap;\n\n if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n return Z_STREAM_ERROR;\n }\n\n /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n if (wrap === 1) {\n /* adler32(strm->adler, dictionary, dictLength); */\n strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n }\n\n s.wrap = 0; /* avoid computing Adler-32 in read_buf */\n\n /* if dictionary would fill window, just replace the history */\n if (dictLength >= s.w_size) {\n if (wrap === 0) { /* already empty otherwise */\n /*** CLEAR_HASH(s); ***/\n zero(s.head); // Fill with NIL (= 0);\n s.strstart = 0;\n s.block_start = 0;\n s.insert = 0;\n }\n /* use the tail */\n // dictionary = dictionary.slice(dictLength - s.w_size);\n tmpDict = new utils.Buf8(s.w_size);\n utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n dictionary = tmpDict;\n dictLength = s.w_size;\n }\n /* insert dictionary into window and hash */\n avail = strm.avail_in;\n next = strm.next_in;\n input = strm.input;\n strm.avail_in = dictLength;\n strm.next_in = 0;\n strm.input = dictionary;\n fill_window(s);\n while (s.lookahead >= MIN_MATCH) {\n str = s.strstart;\n n = s.lookahead - (MIN_MATCH - 1);\n do {\n /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n s.head[s.ins_h] = str;\n str++;\n } while (--n);\n s.strstart = str;\n s.lookahead = MIN_MATCH - 1;\n fill_window(s);\n }\n s.strstart += s.lookahead;\n s.block_start = s.strstart;\n s.insert = s.lookahead;\n s.lookahead = 0;\n s.match_length = s.prev_length = MIN_MATCH - 1;\n s.match_available = 0;\n strm.next_in = next;\n strm.input = input;\n strm.avail_in = avail;\n s.wrap = wrap;\n return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjLG1CQUFPLENBQUMsdUVBQWlCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyw2REFBUztBQUMvQixjQUFjLG1CQUFPLENBQUMsaUVBQVc7QUFDakMsY0FBYyxtQkFBTyxDQUFDLDZEQUFTO0FBQy9CLGNBQWMsbUJBQU8sQ0FBQyxtRUFBWTs7QUFFbEM7QUFDQTs7O0FBR0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOzs7QUFHQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwyQkFBMkI7O0FBRTNCLG9CQUFvQjs7QUFFcEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixzQkFBc0IscUJBQXFCOzs7QUFHaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCLG1CQUFtQjs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qyx5QkFBeUI7QUFDekIsbUNBQW1DO0FBQ25DLHFDQUFxQztBQUNyQyw2Q0FBNkM7QUFDN0MsNkNBQTZDO0FBQzdDO0FBQ0E7O0FBRUEsdUJBQXVCOztBQUV2QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7O0FBRS9CLDRCQUE0QjtBQUM1QixxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBOztBQUVBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBLGlDQUFpQztBQUNqQywwQkFBMEI7QUFDMUIsb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsbUJBQW1CO0FBQ25CLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLHdCQUF3QjtBQUN4QixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLDRCQUE0QjtBQUM1QixtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcz8zZTY2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICApO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC50aW1lICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDgpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQudGltZSA+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5vcyAmIDB4ZmYpO1xuICAgICAgICBpZiAocy5nemhlYWQuZXh0cmEgJiYgcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmEubGVuZ3RoICYgMHhmZik7XG4gICAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCA+PiA4KSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZywgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBFWFRSQV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSAvLyBERUZMQVRFIGhlYWRlclxuICAgIHtcbiAgICAgIHZhciBoZWFkZXIgPSAoWl9ERUZMQVRFRCArICgocy53X2JpdHMgLSA4KSA8PCA0KSkgPDwgODtcbiAgICAgIHZhciBsZXZlbF9mbGFncyA9IC0xO1xuXG4gICAgICBpZiAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHMubGV2ZWwgPCA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA9PT0gNikge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXZlbF9mbGFncyA9IDM7XG4gICAgICB9XG4gICAgICBoZWFkZXIgfD0gKGxldmVsX2ZsYWdzIDw8IDYpO1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHsgaGVhZGVyIHw9IFBSRVNFVF9ESUNUOyB9XG4gICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpO1xuXG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpO1xuXG4gICAgICAvKiBTYXZlIHRoZSBhZGxlcjMyIG9mIHRoZSBwcmVzZXQgZGljdGlvbmFyeTogKi9cbiAgICAgIGlmIChzLnN0cnN0YXJ0ICE9PSAwKSB7XG4gICAgICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gMTsgLy8gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTtcbiAgICB9XG4gIH1cblxuLy8jaWZkZWYgR1pJUFxuICBpZiAocy5zdGF0dXMgPT09IEVYVFJBX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmV4dHJhLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cblxuICAgICAgd2hpbGUgKHMuZ3ppbmRleCA8IChzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmZmYpKSB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSAmIDB4ZmYpO1xuICAgICAgICBzLmd6aW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3ppbmRleCA9PT0gcy5nemhlYWQuZXh0cmEubGVuZ3RoKSB7XG4gICAgICAgIHMuZ3ppbmRleCA9IDA7XG4gICAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IE5BTUVfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gTkFNRV9TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5uYW1lLyogIT0gWl9OVUxMKi8pIHtcbiAgICAgIGJlZyA9IHMucGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi9cbiAgICAgIC8vaW50IHZhbDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgICAgICAgYmVnID0gcy5wZW5kaW5nO1xuICAgICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBKUyBzcGVjaWZpYzogbGl0dGxlIG1hZ2ljIHRvIGFkZCB6ZXJvIHRlcm1pbmF0b3IgdG8gZW5kIG9mIHN0cmluZ1xuICAgICAgICBpZiAocy5nemluZGV4IDwgcy5nemhlYWQubmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICB2YWwgPSBzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspICYgMHhmZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7XG4gICAgICB9IHdoaWxlICh2YWwgIT09IDApO1xuXG4gICAgICBpZiAocy5nemhlYWQuaGNyYyAmJiBzLnBlbmRpbmcgPiBiZWcpIHtcbiAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWwgPT09IDApIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gQ09NTUVOVF9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBDT01NRU5UX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLmNvbW1lbnQvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBIQ1JDX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IEhDUkNfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuaGNyYykge1xuICAgICAgaWYgKHMucGVuZGluZyArIDIgPiBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIH1cbiAgICAgIGlmIChzLnBlbmRpbmcgKyAyIDw9IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDgpICYgMHhmZik7XG4gICAgICAgIHN0cm0uYWRsZXIgPSAwOyAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgIH1cbiAgfVxuLy8jZW5kaWZcblxuICAvKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlICovXG4gIGlmIChzLnBlbmRpbmcgIT09IDApIHtcbiAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aFxuICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmRcbiAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLFxuICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZTpcbiAgICAgICAqL1xuICAgICAgcy5sYXN0X2ZsdXNoID0gLTE7XG4gICAgICByZXR1cm4gWl9PSztcbiAgICB9XG5cbiAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmVcbiAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcFxuICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRl9FUlJPUi5cbiAgICAgKi9cbiAgfSBlbHNlIGlmIChzdHJtLmF2YWlsX2luID09PSAwICYmIHJhbmsoZmx1c2gpIDw9IHJhbmsob2xkX2ZsdXNoKSAmJlxuICAgIGZsdXNoICE9PSBaX0ZJTklTSCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi9cbiAgaWYgKHMuc3RhdHVzID09PSBGSU5JU0hfU1RBVEUgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9CVUZfRVJST1IpO1xuICB9XG5cbiAgLyogU3RhcnQgYSBuZXcgYmxvY2sgb3IgY29udGludWUgdGhlIGN1cnJlbnQgb25lLlxuICAgKi9cbiAgaWYgKHN0cm0uYXZhaWxfaW4gIT09IDAgfHwgcy5sb29rYWhlYWQgIT09IDAgfHxcbiAgICAoZmx1c2ggIT09IFpfTk9fRkxVU0ggJiYgcy5zdGF0dXMgIT09IEZJTklTSF9TVEFURSkpIHtcbiAgICB2YXIgYnN0YXRlID0gKHMuc3RyYXRlZ3kgPT09IFpfSFVGRk1BTl9PTkxZKSA/IGRlZmxhdGVfaHVmZihzLCBmbHVzaCkgOlxuICAgICAgKHMuc3RyYXRlZ3kgPT09IFpfUkxFID8gZGVmbGF0ZV9ybGUocywgZmx1c2gpIDpcbiAgICAgICAgY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsIGZsdXNoKSk7XG5cbiAgICBpZiAoYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCB8fCBic3RhdGUgPT09IEJTX0ZJTklTSF9ET05FKSB7XG4gICAgICBzLnN0YXR1cyA9IEZJTklTSF9TVEFURTtcbiAgICB9XG4gICAgaWYgKGJzdGF0ZSA9PT0gQlNfTkVFRF9NT1JFIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX1NUQVJURUQpIHtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgICAgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICB9XG4gICAgICByZXR1cm4gWl9PSztcbiAgICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGxcbiAgICAgICAqIG9mIGRlZmxhdGUgc2hvdWxkIHVzZSB0aGUgc2FtZSBmbHVzaCBwYXJhbWV0ZXIgdG8gbWFrZSBzdXJlXG4gICAgICAgKiB0aGF0IHRoZSBmbHVzaCBpcyBjb21wbGV0ZS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBvdXRwdXQgYW5cbiAgICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvXG4gICAgICAgKiBlbnN1cmVzIHRoYXQgZm9yIGEgdmVyeSBzbWFsbCBvdXRwdXQgYnVmZmVyLCB3ZSBlbWl0IGF0IG1vc3RcbiAgICAgICAqIG9uZSBlbXB0eSBibG9jay5cbiAgICAgICAqL1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19CTE9DS19ET05FKSB7XG4gICAgICBpZiAoZmx1c2ggPT09IFpfUEFSVElBTF9GTFVTSCkge1xuICAgICAgICB0cmVlcy5fdHJfYWxpZ24ocyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmbHVzaCAhPT0gWl9CTE9DSykgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi9cblxuICAgICAgICB0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsIDAsIDAsIGZhbHNlKTtcbiAgICAgICAgLyogRm9yIGEgZnVsbCBmbHVzaCwgdGhpcyBlbXB0eSBibG9jayB3aWxsIGJlIHJlY29nbml6ZWRcbiAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9GVUxMX0ZMVVNIKSB7XG4gICAgICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovXG4gICAgICAgICAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gICAgICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgICAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5pbnNlcnQgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICBzLmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCwgc2VlIGFib3ZlICovXG4gICAgICAgIHJldHVybiBaX09LO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0Fzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCBcImJ1ZzJcIik7XG4gIC8vaWYgKHN0cm0uYXZhaWxfb3V0IDw9IDApIHsgdGhyb3cgbmV3IEVycm9yKFwiYnVnMlwiKTt9XG5cbiAgaWYgKGZsdXNoICE9PSBaX0ZJTklTSCkgeyByZXR1cm4gWl9PSzsgfVxuICBpZiAocy53cmFwIDw9IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VORDsgfVxuXG4gIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovXG4gIGlmIChzLndyYXAgPT09IDIpIHtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLmFkbGVyICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiAyNCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCBzdHJtLnRvdGFsX2luICYgMHhmZik7XG4gICAgcHV0X2J5dGUocywgKHN0cm0udG90YWxfaW4gPj4gOCkgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAxNikgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiAyNCkgJiAweGZmKTtcbiAgfVxuICBlbHNlXG4gIHtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyID4+PiAxNik7XG4gICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciAmIDB4ZmZmZik7XG4gIH1cblxuICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluXG4gICAqIHRvIGZsdXNoIHRoZSByZXN0LlxuICAgKi9cbiAgaWYgKHMud3JhcCA+IDApIHsgcy53cmFwID0gLXMud3JhcDsgfVxuICAvKiB3cml0ZSB0aGUgdHJhaWxlciBvbmx5IG9uY2UhICovXG4gIHJldHVybiBzLnBlbmRpbmcgIT09IDAgPyBaX09LIDogWl9TVFJFQU1fRU5EO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pIHtcbiAgdmFyIHN0YXR1cztcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHN0YXR1cyA9IHN0cm0uc3RhdGUuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSBJTklUX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBFWFRSQV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gTkFNRV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQ09NTUVOVF9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gSENSQ19TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gQlVTWV9TVEFURSAmJlxuICAgIHN0YXR1cyAhPT0gRklOSVNIX1NUQVRFXG4gICkge1xuICAgIHJldHVybiBlcnIoc3RybSwgWl9TVFJFQU1fRVJST1IpO1xuICB9XG5cbiAgc3RybS5zdGF0ZSA9IG51bGw7XG5cbiAgcmV0dXJuIHN0YXR1cyA9PT0gQlVTWV9TVEFURSA/IGVycihzdHJtLCBaX0RBVEFfRVJST1IpIDogWl9PSztcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlXG4gKiBzZXF1ZW5jZSB3aXRob3V0IHByb2R1Y2luZyBhbnkgY29tcHJlc3NlZCBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgcztcbiAgdmFyIHN0ciwgbjtcbiAgdmFyIHdyYXA7XG4gIHZhciBhdmFpbDtcbiAgdmFyIG5leHQ7XG4gIHZhciBpbnB1dDtcbiAgdmFyIHRtcERpY3Q7XG5cbiAgaWYgKCFzdHJtLyo9PSBaX05VTEwqLyB8fCAhc3RybS5zdGF0ZS8qPT0gWl9OVUxMKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzID0gc3RybS5zdGF0ZTtcbiAgd3JhcCA9IHMud3JhcDtcblxuICBpZiAod3JhcCA9PT0gMiB8fCAod3JhcCA9PT0gMSAmJiBzLnN0YXR1cyAhPT0gSU5JVF9TVEFURSkgfHwgcy5sb29rYWhlYWQpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi9cbiAgaWYgKHdyYXAgPT09IDEpIHtcbiAgICAvKiBhZGxlcjMyKHN0cm0tPmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBzdHJtLmFkbGVyID0gYWRsZXIzMihzdHJtLmFkbGVyLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgfVxuXG4gIHMud3JhcCA9IDA7ICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovXG5cbiAgLyogaWYgZGljdGlvbmFyeSB3b3VsZCBmaWxsIHdpbmRvdywganVzdCByZXBsYWNlIHRoZSBoaXN0b3J5ICovXG4gIGlmIChkaWN0TGVuZ3RoID49IHMud19zaXplKSB7XG4gICAgaWYgKHdyYXAgPT09IDApIHsgICAgICAgICAgICAvKiBhbHJlYWR5IGVtcHR5IG90aGVyd2lzZSAqL1xuICAgICAgLyoqKiBDTEVBUl9IQVNIKHMpOyAqKiovXG4gICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG4gICAgICBzLnN0cnN0YXJ0ID0gMDtcbiAgICAgIHMuYmxvY2tfc3RhcnQgPSAwO1xuICAgICAgcy5pbnNlcnQgPSAwO1xuICAgIH1cbiAgICAvKiB1c2UgdGhlIHRhaWwgKi9cbiAgICAvLyBkaWN0aW9uYXJ5ID0gZGljdGlvbmFyeS5zbGljZShkaWN0TGVuZ3RoIC0gcy53X3NpemUpO1xuICAgIHRtcERpY3QgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSk7XG4gICAgdXRpbHMuYXJyYXlTZXQodG1wRGljdCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCAtIHMud19zaXplLCBzLndfc2l6ZSwgMCk7XG4gICAgZGljdGlvbmFyeSA9IHRtcERpY3Q7XG4gICAgZGljdExlbmd0aCA9IHMud19zaXplO1xuICB9XG4gIC8qIGluc2VydCBkaWN0aW9uYXJ5IGludG8gd2luZG93IGFuZCBoYXNoICovXG4gIGF2YWlsID0gc3RybS5hdmFpbF9pbjtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBzdHJtLmF2YWlsX2luID0gZGljdExlbmd0aDtcbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5pbnB1dCA9IGRpY3Rpb25hcnk7XG4gIGZpbGxfd2luZG93KHMpO1xuICB3aGlsZSAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgc3RyID0gcy5zdHJzdGFydDtcbiAgICBuID0gcy5sb29rYWhlYWQgLSAoTUlOX01BVENIIC0gMSk7XG4gICAgZG8ge1xuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbc3RyICsgTUlOX01BVENIIC0gMV0pICYgcy5oYXNoX21hc2s7XG5cbiAgICAgIHMucHJldltzdHIgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG5cbiAgICAgIHMuaGVhZFtzLmluc19oXSA9IHN0cjtcbiAgICAgIHN0cisrO1xuICAgIH0gd2hpbGUgKC0tbik7XG4gICAgcy5zdHJzdGFydCA9IHN0cjtcbiAgICBzLmxvb2thaGVhZCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgZmlsbF93aW5kb3cocyk7XG4gIH1cbiAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgcy5ibG9ja19zdGFydCA9IHMuc3Ryc3RhcnQ7XG4gIHMuaW5zZXJ0ID0gcy5sb29rYWhlYWQ7XG4gIHMubG9va2FoZWFkID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICBzdHJtLmlucHV0ID0gaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBhdmFpbDtcbiAgcy53cmFwID0gd3JhcDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZXhwb3J0cy5kZWZsYXRlSW5pdCA9IGRlZmxhdGVJbml0O1xuZXhwb3J0cy5kZWZsYXRlSW5pdDIgPSBkZWZsYXRlSW5pdDI7XG5leHBvcnRzLmRlZmxhdGVSZXNldCA9IGRlZmxhdGVSZXNldDtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0S2VlcCA9IGRlZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmRlZmxhdGVTZXRIZWFkZXIgPSBkZWZsYXRlU2V0SGVhZGVyO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZUVuZCA9IGRlZmxhdGVFbmQ7XG5leHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5ID0gZGVmbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmRlZmxhdGVJbmZvID0gJ3Bha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuZGVmbGF0ZUJvdW5kID0gZGVmbGF0ZUJvdW5kO1xuZXhwb3J0cy5kZWZsYXRlQ29weSA9IGRlZmxhdGVDb3B5O1xuZXhwb3J0cy5kZWZsYXRlUGFyYW1zID0gZGVmbGF0ZVBhcmFtcztcbmV4cG9ydHMuZGVmbGF0ZVBlbmRpbmcgPSBkZWZsYXRlUGVuZGluZztcbmV4cG9ydHMuZGVmbGF0ZVByaW1lID0gZGVmbGF0ZVByaW1lO1xuZXhwb3J0cy5kZWZsYXRlVHVuZSA9IGRlZmxhdGVUdW5lO1xuKi9cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/deflate.js\n");
117
+
118
+ /***/ }),
119
+
120
+ /***/ "../../../node_modules/pako/lib/zlib/gzheader.js":
121
+ /*!*******************************************************!*\
122
+ !*** ../../../node_modules/pako/lib/zlib/gzheader.js ***!
123
+ \*******************************************************/
124
+ /***/ ((module) => {
125
+
126
+ "use strict";
127
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n}\n\nmodule.exports = GZheader;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcz8zZGZhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5mdW5jdGlvbiBHWmhlYWRlcigpIHtcbiAgLyogdHJ1ZSBpZiBjb21wcmVzc2VkIGRhdGEgYmVsaWV2ZWQgdG8gYmUgdGV4dCAqL1xuICB0aGlzLnRleHQgICAgICAgPSAwO1xuICAvKiBtb2RpZmljYXRpb24gdGltZSAqL1xuICB0aGlzLnRpbWUgICAgICAgPSAwO1xuICAvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLnhmbGFncyAgICAgPSAwO1xuICAvKiBvcGVyYXRpbmcgc3lzdGVtICovXG4gIHRoaXMub3MgICAgICAgICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi9cbiAgdGhpcy5leHRyYSAgICAgID0gbnVsbDtcbiAgLyogZXh0cmEgZmllbGQgbGVuZ3RoICh2YWxpZCBpZiBleHRyYSAhPSBaX05VTEwpICovXG4gIHRoaXMuZXh0cmFfbGVuICA9IDA7IC8vIEFjdHVhbGx5LCB3ZSBkb24ndCBuZWVkIGl0IGluIEpTLFxuICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgbGVhdmUgZm9yIGZldyBjb2RlIG1vZGlmaWNhdGlvbnNcblxuICAvL1xuICAvLyBTZXR1cCBsaW1pdHMgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5XG4gIC8vIGZvciBpbmZsYXRlIHVzZSBjb25zdGFudCBsaW1pdCBpbiA2NTUzNiBieXRlc1xuICAvL1xuXG4gIC8qIHNwYWNlIGF0IGV4dHJhIChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovXG4gIC8vIHRoaXMuZXh0cmFfbWF4ICA9IDA7XG4gIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi9cbiAgdGhpcy5uYW1lICAgICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5uYW1lX21heCAgID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi9cbiAgdGhpcy5jb21tZW50ICAgID0gJyc7XG4gIC8qIHNwYWNlIGF0IGNvbW1lbnQgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5jb21tX21heCAgID0gMDtcbiAgLyogdHJ1ZSBpZiB0aGVyZSB3YXMgb3Igd2lsbCBiZSBhIGhlYWRlciBjcmMgKi9cbiAgdGhpcy5oY3JjICAgICAgID0gMDtcbiAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqL1xuICB0aGlzLmRvbmUgICAgICAgPSBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHWmhlYWRlcjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/gzheader.js\n");
128
+
129
+ /***/ }),
130
+
131
+ /***/ "../../../node_modules/pako/lib/zlib/inffast.js":
132
+ /*!******************************************************!*\
133
+ !*** ../../../node_modules/pako/lib/zlib/inffast.js ***!
134
+ \******************************************************/
135
+ /***/ ((module) => {
136
+
137
+ "use strict";
138
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n\n/*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n var state;\n var _in; /* local strm.input */\n var last; /* have enough input while in < last */\n var _out; /* local strm.output */\n var beg; /* inflate()'s initial strm.output */\n var end; /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n var dmax; /* maximum distance from zlib header */\n//#endif\n var wsize; /* window size or zero if not using window */\n var whave; /* valid bytes in the window */\n var wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n var s_window; /* allocated sliding window, if wsize != 0 */\n var hold; /* local strm.hold */\n var bits; /* local strm.bits */\n var lcode; /* local strm.lencode */\n var dcode; /* local strm.distcode */\n var lmask; /* mask for first level of length codes */\n var dmask; /* mask for first level of distance codes */\n var here; /* retrieved table entry */\n var op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n var len; /* match length, unused bytes */\n var dist; /* match distance */\n var from; /* where to copy match from */\n var from_source;\n\n\n var input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n dmax = state.dmax;\n//#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n//#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break top;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// if (len <= op - whave) {\n// do {\n// output[_out++] = 0;\n// } while (--len);\n// continue top;\n// }\n// len -= op - whave;\n// do {\n// output[_out++] = 0;\n// } while (--op > whave);\n// if (op === 0) {\n// from = _out - dist;\n// do {\n// output[_out++] = output[from++];\n// } while (--len);\n// continue top;\n// }\n//#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mZmFzdC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQixvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0EsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCOzs7QUFHQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFdBQVcsSUFBSTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsSUFBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7QUFDOUM7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUMsNENBQTRDO0FBQzVDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQix1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQywwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzP2FkZWQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFNlZSBzdGF0ZSBkZWZzIGZyb20gaW5mbGF0ZS5qc1xudmFyIEJBRCA9IDMwOyAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cblxuLypcbiAgIERlY29kZSBsaXRlcmFsLCBsZW5ndGgsIGFuZCBkaXN0YW5jZSBjb2RlcyBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRpbmdcbiAgIGxpdGVyYWwgYW5kIG1hdGNoIGJ5dGVzIHVudGlsIGVpdGhlciBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBpc1xuICAgYXZhaWxhYmxlLCBhbiBlbmQtb2YtYmxvY2sgaXMgZW5jb3VudGVyZWQsIG9yIGEgZGF0YSBlcnJvciBpcyBlbmNvdW50ZXJlZC5cbiAgIFdoZW4gbGFyZ2UgZW5vdWdoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgc3VwcGxpZWQgdG8gaW5mbGF0ZSgpLCBmb3JcbiAgIGV4YW1wbGUsIGEgMTZLIGlucHV0IGJ1ZmZlciBhbmQgYSA2NEsgb3V0cHV0IGJ1ZmZlciwgbW9yZSB0aGFuIDk1JSBvZiB0aGVcbiAgIGluZmxhdGUgZXhlY3V0aW9uIHRpbWUgaXMgc3BlbnQgaW4gdGhpcyByb3V0aW5lLlxuXG4gICBFbnRyeSBhc3N1bXB0aW9uczpcblxuICAgICAgICBzdGF0ZS5tb2RlID09PSBMRU5cbiAgICAgICAgc3RybS5hdmFpbF9pbiA+PSA2XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID49IDI1OFxuICAgICAgICBzdGFydCA+PSBzdHJtLmF2YWlsX291dFxuICAgICAgICBzdGF0ZS5iaXRzIDwgOFxuXG4gICBPbiByZXR1cm4sIHN0YXRlLm1vZGUgaXMgb25lIG9mOlxuXG4gICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dFxuICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9ja1xuICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YVxuXG4gICBOb3RlczpcblxuICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlXG4gICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSxcbiAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuXG4gICAgICBUaGVyZWZvcmUgaWYgc3RybS5hdmFpbF9pbiA+PSA2LCB0aGVuIHRoZXJlIGlzIGVub3VnaCBpbnB1dCB0byBhdm9pZFxuICAgICAgY2hlY2tpbmcgZm9yIGF2YWlsYWJsZSBpbnB1dCB3aGlsZSBkZWNvZGluZy5cblxuICAgIC0gVGhlIG1heGltdW0gYnl0ZXMgdGhhdCBhIHNpbmdsZSBsZW5ndGgvZGlzdGFuY2UgcGFpciBjYW4gb3V0cHV0IGlzIDI1OFxuICAgICAgYnl0ZXMsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGxlbmd0aCB0aGF0IGNhbiBiZSBjb2RlZC4gIGluZmxhdGVfZmFzdCgpXG4gICAgICByZXF1aXJlcyBzdHJtLmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3JcbiAgICAgIG91dHB1dCBzcGFjZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSwgc3RhcnQpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgX2luOyAgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5pbnB1dCAqL1xuICB2YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogaGF2ZSBlbm91Z2ggaW5wdXQgd2hpbGUgaW4gPCBsYXN0ICovXG4gIHZhciBfb3V0OyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgYmVnOyAgICAgICAgICAgICAgICAgICAgLyogaW5mbGF0ZSgpJ3MgaW5pdGlhbCBzdHJtLm91dHB1dCAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovXG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICB2YXIgZG1heDsgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovXG4vLyNlbmRpZlxuICB2YXIgd3NpemU7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHZhciB3aGF2ZTsgICAgICAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHZhciB3bmV4dDsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgLy8gVXNlIGBzX3dpbmRvd2AgaW5zdGVhZCBgd2luZG93YCwgYXZvaWQgY29uZmxpY3Qgd2l0aCBpbnN0cnVtZW50YXRpb24gdG9vbHNcbiAgdmFyIHNfd2luZG93OyAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5ob2xkICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmJpdHMgKi9cbiAgdmFyIGxjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ubGVuY29kZSAqL1xuICB2YXIgZGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5kaXN0Y29kZSAqL1xuICB2YXIgbG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovXG4gIHZhciBkbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuICB2YXIgaGVyZTsgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovXG4gIHZhciBvcDsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB3aW5kb3cgcG9zaXRpb24sIHdpbmRvdyBieXRlcyB0byBjb3B5ICovXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqL1xuICB2YXIgZGlzdDsgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG5cblxuICB2YXIgaW5wdXQsIG91dHB1dDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuXG4gIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovXG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgLy9oZXJlID0gc3RhdGUuaGVyZTtcbiAgX2luID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGxhc3QgPSBfaW4gKyAoc3RybS5hdmFpbF9pbiAtIDUpO1xuICBfb3V0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGJlZyA9IF9vdXQgLSAoc3RhcnQgLSBzdHJtLmF2YWlsX291dCk7XG4gIGVuZCA9IF9vdXQgKyAoc3RybS5hdmFpbF9vdXQgLSAyNTcpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgZG1heCA9IHN0YXRlLmRtYXg7XG4vLyNlbmRpZlxuICB3c2l6ZSA9IHN0YXRlLndzaXplO1xuICB3aGF2ZSA9IHN0YXRlLndoYXZlO1xuICB3bmV4dCA9IHN0YXRlLnduZXh0O1xuICBzX3dpbmRvdyA9IHN0YXRlLndpbmRvdztcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICBsY29kZSA9IHN0YXRlLmxlbmNvZGU7XG4gIGRjb2RlID0gc3RhdGUuZGlzdGNvZGU7XG4gIGxtYXNrID0gKDEgPDwgc3RhdGUubGVuYml0cykgLSAxO1xuICBkbWFzayA9ICgxIDw8IHN0YXRlLmRpc3RiaXRzKSAtIDE7XG5cblxuICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2hcbiAgICAgaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgKi9cblxuICB0b3A6XG4gIGRvIHtcbiAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICB9XG5cbiAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTtcblxuICAgIGRvbGVuOlxuICAgIGZvciAoOzspIHsgLy8gR290byBlbXVsYXRpb25cbiAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgYml0cyAtPSBvcDtcbiAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcbiAgICAgIGlmIChvcCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xcblwiIDpcbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxcblwiLCBoZXJlLnZhbCkpO1xuICAgICAgICBvdXRwdXRbX291dCsrXSA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi9cbiAgICAgICAgbGVuID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgaWYgKG9wKSB7XG4gICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGVuICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBsZW5ndGggJXVcXG5cIiwgbGVuKSk7XG4gICAgICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTtcblxuICAgICAgICBkb2Rpc3Q6XG4gICAgICAgIGZvciAoOzspIHsgLy8gZ290byBlbXVsYXRpb25cbiAgICAgICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG5cbiAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovXG4gICAgICAgICAgICBkaXN0ID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi9cbiAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3QgKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgZGlzdCkpO1xuICAgICAgICAgICAgb3AgPSBfb3V0IC0gYmVnOyAgICAgICAgICAgICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovXG4gICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgICAgICAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuLy8jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSXG4vLyAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTtcbi8vICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCA+IHdoYXZlKTtcbi8vICAgICAgICAgICAgICAgIGlmIChvcCA9PT0gMCkge1xuLy8gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnJvbSA9IDA7IC8vIHdpbmRvdyBpbmRleFxuICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IHNfd2luZG93O1xuICAgICAgICAgICAgICBpZiAod25leHQgPT09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmICh3bmV4dCA8IG9wKSB7ICAgICAgLyogd3JhcCBhcm91bmQgd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgb3AgLT0gd25leHQ7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIGVuZCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gMDtcbiAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA8IGxlbikgeyAgLyogc29tZSBmcm9tIHN0YXJ0IG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgICBvcCA9IHduZXh0O1xuICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi9cbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBsZW4gLT0gMztcbiAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKSB7XG4gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgLyogMm5kIGxldmVsIGRpc3RhbmNlIGNvZGUgKi9cbiAgICAgICAgICAgIGhlcmUgPSBkY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICAgICAgY29udGludWUgZG9kaXN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgY29kZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGhlcmUgPSBsY29kZVsoaGVyZSAmIDB4ZmZmZikvKmhlcmUudmFsKi8gKyAoaG9sZCAmICgoMSA8PCBvcCkgLSAxKSldO1xuICAgICAgICBjb250aW51ZSBkb2xlbjtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMzIpIHsgICAgICAgICAgICAgICAgICAgICAvKiBlbmQtb2YtYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBlbmQgb2YgYmxvY2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICB9XG4gIH0gd2hpbGUgKF9pbiA8IGxhc3QgJiYgX291dCA8IGVuZCk7XG5cbiAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovXG4gIGxlbiA9IGJpdHMgPj4gMztcbiAgX2luIC09IGxlbjtcbiAgYml0cyAtPSBsZW4gPDwgMztcbiAgaG9sZCAmPSAoMSA8PCBiaXRzKSAtIDE7XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi9cbiAgc3RybS5uZXh0X2luID0gX2luO1xuICBzdHJtLm5leHRfb3V0ID0gX291dDtcbiAgc3RybS5hdmFpbF9pbiA9IChfaW4gPCBsYXN0ID8gNSArIChsYXN0IC0gX2luKSA6IDUgLSAoX2luIC0gbGFzdCkpO1xuICBzdHJtLmF2YWlsX291dCA9IChfb3V0IDwgZW5kID8gMjU3ICsgKGVuZCAtIF9vdXQpIDogMjU3IC0gKF9vdXQgLSBlbmQpKTtcbiAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gIHN0YXRlLmJpdHMgPSBiaXRzO1xuICByZXR1cm47XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/inffast.js\n");
139
+
140
+ /***/ }),
141
+
142
+ /***/ "../../../node_modules/pako/lib/zlib/inflate.js":
143
+ /*!******************************************************!*\
144
+ !*** ../../../node_modules/pako/lib/zlib/inflate.js ***!
145
+ \******************************************************/
146
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
147
+
148
+ "use strict";
149
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = __webpack_require__(/*! ../utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\nvar adler32 = __webpack_require__(/*! ./adler32 */ \"../../../node_modules/pako/lib/zlib/adler32.js\");\nvar crc32 = __webpack_require__(/*! ./crc32 */ \"../../../node_modules/pako/lib/zlib/crc32.js\");\nvar inflate_fast = __webpack_require__(/*! ./inffast */ \"../../../node_modules/pako/lib/zlib/inffast.js\");\nvar inflate_table = __webpack_require__(/*! ./inftrees */ \"../../../node_modules/pako/lib/zlib/inftrees.js\");\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH = 2;\n//var Z_FULL_FLUSH = 3;\nvar Z_FINISH = 4;\nvar Z_BLOCK = 5;\nvar Z_TREES = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK = 0;\nvar Z_STREAM_END = 1;\nvar Z_NEED_DICT = 2;\n//var Z_ERRNO = -1;\nvar Z_STREAM_ERROR = -2;\nvar Z_DATA_ERROR = -3;\nvar Z_MEM_ERROR = -4;\nvar Z_BUF_ERROR = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar HEAD = 1; /* i: waiting for magic header */\nvar FLAGS = 2; /* i: waiting for method and flags (gzip) */\nvar TIME = 3; /* i: waiting for modification time (gzip) */\nvar OS = 4; /* i: waiting for extra flags and operating system (gzip) */\nvar EXLEN = 5; /* i: waiting for extra length (gzip) */\nvar EXTRA = 6; /* i: waiting for extra bytes (gzip) */\nvar NAME = 7; /* i: waiting for end of file name (gzip) */\nvar COMMENT = 8; /* i: waiting for end of comment (gzip) */\nvar HCRC = 9; /* i: waiting for header crc (gzip) */\nvar DICTID = 10; /* i: waiting for dictionary check value */\nvar DICT = 11; /* waiting for inflateSetDictionary() call */\nvar TYPE = 12; /* i: waiting for type bits, including last-flag bit */\nvar TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\nvar STORED = 14; /* i: waiting for stored size (length and complement) */\nvar COPY_ = 15; /* i/o: same as COPY below, but only first time in */\nvar COPY = 16; /* i/o: waiting for input or output to copy stored block */\nvar TABLE = 17; /* i: waiting for dynamic block table lengths */\nvar LENLENS = 18; /* i: waiting for code length code lengths */\nvar CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\nvar LEN_ = 20; /* i: same as LEN below, but only first time in */\nvar LEN = 21; /* i: waiting for length/lit/eob code */\nvar LENEXT = 22; /* i: waiting for length extra bits */\nvar DIST = 23; /* i: waiting for distance code */\nvar DISTEXT = 24; /* i: waiting for distance extra bits */\nvar MATCH = 25; /* o: waiting for output space to copy string */\nvar LIT = 26; /* o: waiting for output space to write literal */\nvar CHECK = 27; /* i: waiting for 32-bit check value */\nvar LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\nvar DONE = 29; /* finished check, done -- remain here until reset */\nvar BAD = 30; /* got a data error -- remain here until reset */\nvar MEM = 31; /* got an inflate() memory error -- remain here until reset */\nvar SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n this.work = new utils.Buf16(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new utils.Buf32(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK;\n}\n\nfunction inflateReset(strm) {\n var state;\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n var wrap;\n var state;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n var ret;\n var state;\n\n if (!strm) { return Z_STREAM_ERROR; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n}\n\nfunction inflateInit(strm) {\n return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n var sym;\n\n lenfix = new utils.Buf32(512);\n distfix = new utils.Buf32(32);\n\n /* literal/length table */\n sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n var dist;\n var state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new utils.Buf8(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n utils.arraySet(state.window, src, end - copy, copy, 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n}\n\nfunction inflate(strm, flush) {\n var state;\n var input, output; // input/output buffers\n var next; /* next input INDEX */\n var put; /* next output INDEX */\n var have, left; /* available input and output */\n var hold; /* bit buffer */\n var bits; /* bits in bit buffer */\n var _in, _out; /* save starting available input and output */\n var copy; /* number of stored or match bytes to copy */\n var from; /* where to copy match bytes from */\n var from_source;\n var here = 0; /* current decoding table entry */\n var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //var last; /* parent table entry */\n var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n var len; /* length to copy for repeats, bits to drop */\n var ret; /* return code */\n var hbuf = new utils.Buf8(4); /* buffer for gzip header crc calculation */\n var opts;\n\n var n; // temporary var for NEED_BITS\n\n var order = /* permutation of code lengths */\n [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n state.dmax = 1 << len;\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Array(state.head.extra_len);\n }\n utils.arraySet(\n state.head.extra,\n input,\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n copy,\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n utils.arraySet(output, input, next, copy, put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inflate_fast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n//#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n//#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n// Trace((stderr, \"inflate.c too far\\n\"));\n// copy -= state.whave;\n// if (copy > state.length) { copy = state.length; }\n// if (copy > left) { copy = left; }\n// left -= copy;\n// state.length -= copy;\n// do {\n// output[put++] = 0;\n// } while (--copy);\n// if (state.length === 0) { state.mode = LEN; }\n// break;\n//#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n}\n\nfunction inflateEnd(strm) {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR;\n }\n\n var state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n var state;\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n var dictLength = dictionary.length;\n\n var state;\n var dictid;\n var ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsbUJBQU8sQ0FBQyx1RUFBaUI7QUFDN0Msb0JBQW9CLG1CQUFPLENBQUMsaUVBQVc7QUFDdkMsb0JBQW9CLG1CQUFPLENBQUMsNkRBQVM7QUFDckMsb0JBQW9CLG1CQUFPLENBQUMsaUVBQVc7QUFDdkMsb0JBQW9CLG1CQUFPLENBQUMsbUVBQVk7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBOzs7QUFHQSx1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQiwyQkFBMkI7QUFDM0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IsK0JBQStCO0FBQy9CLHVCQUF1QjtBQUN2Qix1QkFBdUI7QUFDdkIsdUJBQXVCO0FBQ3ZCLHVCQUF1QjtBQUN2Qix1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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLDRCQUE0QjtBQUM1QiwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CO0FBQ3BCLHFCQUFxQjtBQUNyQix3QkFBd0I7QUFDeEIsbUJBQW1CO0FBQ25CLG9CQUFvQjtBQUNwQixlQUFlO0FBQ2Ysa0JBQWtCO0FBQ2xCLHdCQUF3QjtBQUN4Qiw0QkFBNEI7QUFDNUIsbUJBQW1COztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcz81YWY1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgICBjYXNlIEhFQUQ6XG4gICAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuXG4gICAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgICBob2xkID0gMDtcbiAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IEZMQUdTO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqL1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGhlYWRlciBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICAgIGJpdHMgLT0gNDtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgICBzdGF0ZS53Yml0cyA9IGxlbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgd2luZG93IHNpemUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAxLyphZGxlcjMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZMQUdTOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUSU1FOlxuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzNdID0gKGhvbGQgPj4+IDI0KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgICAgLy89PT1cbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIE9TOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgICAgc3RhdGUuaGVhZC5vcyA9IChob2xkID4+IDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWExFTjpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX2xlbiA9IGhvbGQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG51bGwvKlpfTlVMTCovO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBFWFRSQTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB1bnR5cGVkIGFycmF5IGZvciBtb3JlIGNvbnZlbmllbnQgcHJvY2Vzc2luZyBsYXRlclxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHV0aWxzLmFycmF5U2V0KFxuICAgICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgICBjb3B5LFxuICAgICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuIDogY29weSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGgpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IE5BTUU7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTkFNRTpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwODAwKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgY29weSA9IDA7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPTU1FTlQ6XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGNvcHkgPSAwO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQuY29tbV9tYXgqLykpIHtcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuICAgICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGlmIChsZW4pIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuY29tbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgSENSQzpcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaGVhZGVyIGNyYyBtaXNtYXRjaCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBESUNUSUQ6XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IERJQ1Q7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgRElDVDpcbiAgICAgICAgaWYgKHN0YXRlLmhhdmVkaWN0ID09PSAwKSB7XG4gICAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9vdXQgPSBsZWZ0O1xuICAgICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgICAgc3RhdGUuaG9sZCA9IGhvbGQ7XG4gICAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgICAgLy8tLS1cbiAgICAgICAgICByZXR1cm4gWl9ORUVEX0RJQ1Q7XG4gICAgICAgIH1cbiAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBUWVBFOlxuICAgICAgICBpZiAoZmx1c2ggPT09IFpfQkxPQ0sgfHwgZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgVFlQRURPOlxuICAgICAgICBpZiAoc3RhdGUubGFzdCkge1xuICAgICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDE7XG4gICAgICAgIGJpdHMgLT0gMTtcbiAgICAgICAgLy8tLS0vL1xuXG4gICAgICAgIHN3aXRjaCAoKGhvbGQgJiAweDAzKS8qQklUUygyKSovKSB7XG4gICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqL1xuICAgICAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAgICAgLy8gICAgICAgIHN0YXRlLmxhc3QgPyBcIiAobGFzdClcIiA6IFwiXCIpKTtcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNUT1JFRDpcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vLyAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovXG4gICAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPT0gKChob2xkID4+PiAxNikgXiAweGZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcXG5cIixcbiAgICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubW9kZSA9IENPUFlfO1xuICAgICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgQ09QWV86XG4gICAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPUFk6XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSB7IGNvcHkgPSBoYXZlOyB9XG4gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgLy8tLS0gem1lbWNweShwdXQsIG5leHQsIGNvcHkpOyAtLS1cbiAgICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgICBwdXQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRBQkxFOlxuICAgICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTQpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IDU7XG4gICAgICAgIGJpdHMgLT0gNTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5uZGlzdCA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDE7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgICBiaXRzIC09IDU7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gNDtcbiAgICAgICAgYml0cyAtPSA0O1xuICAgICAgICAvLy0tLS8vXG4vLyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkRcbiAgICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkxFTlM6XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvL3N0YXRlLm5leHQgPSBzdGF0ZS5jb2RlcztcbiAgICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICAgIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW47XG4gICAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUubGVucywgMCwgMTksIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgICAgc3RhdGUubW9kZSA9IENPREVMRU5TO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIENPREVMRU5TOlxuICAgICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAyO1xuICAgICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDAzKTsvL0JJVFMoMik7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGhlcmVfdmFsID09PSAxNykge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAzICsgKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICAgIGNvcHkgPSAxMSArIChob2xkICYgMHg3Zik7Ly9CSVRTKDcpO1xuICAgICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgICAgYml0cyAtPSA3O1xuICAgICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaGF2ZSArIGNvcHkgPiBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgICBzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK10gPSBsZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovXG4gICAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzXG4gICAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gOTtcblxuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgICAvLyBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSA2O1xuICAgICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgICAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluO1xuICAgICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAgIC8vIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dDtcblxuICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsICdpbmZsYXRlOiAgICAgICBjb2RlcyBva1xcbicpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBMRU5fOlxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTjpcbiAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAgIC8vLS0tIFJFU1RPUkUoKSAtLS1cbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgICBzdHJtLm5leHRfaW4gPSBuZXh0O1xuICAgICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICAgIHN0YXRlLmJpdHMgPSBiaXRzO1xuICAgICAgICAgIC8vLS0tXG4gICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAgIC8vLS0tIExPQUQoKSAtLS1cbiAgICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICAgIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgICAvLy0tLVxuXG4gICAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuYmFjayA9IDA7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKGhlcmVfYml0cyA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgP1xuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gTElUO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgMzIpIHtcbiAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5FWFQ7XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgTEVORVhUOlxuICAgICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgICBzdGF0ZS53YXMgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1Q6XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUub2Zmc2V0ID0gaGVyZV92YWw7XG4gICAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIERJU1RFWFQ6XG4gICAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgc3RhdGUub2Zmc2V0ICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICAgIH1cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gICAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcXG5cIiwgc3RhdGUub2Zmc2V0KSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBNQVRDSDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovXG4gICAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnNhbmUpIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYXVsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLnduZXh0KSB7XG4gICAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS5vZmZzZXQ7XG4gICAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSB7IHN0YXRlLm1vZGUgPSBMRU47IH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExJVDpcbiAgICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGxlZnQtLTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENIRUNLOlxuICAgICAgICBpZiAoc3RhdGUud3JhcCkge1xuICAgICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgIC8vIFVzZSAnfCcgaW5zdGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgICAgaG9sZCB8PSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICAgICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAgIC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBwdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgX291dCA9IGxlZnQ7XG4gICAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGRhdGEgY2hlY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICAgIGhvbGQgPSAwO1xuICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlIExFTkdUSDpcbiAgICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5tb2RlID0gRE9ORTtcbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBET05FOlxuICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgQkFEOlxuICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7XG4gICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgIGNhc2UgTUVNOlxuICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgICBjYXNlIFNZTkM6XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/inflate.js\n");
150
+
151
+ /***/ }),
152
+
153
+ /***/ "../../../node_modules/pako/lib/zlib/inftrees.js":
154
+ /*!*******************************************************!*\
155
+ !*** ../../../node_modules/pako/lib/zlib/inftrees.js ***!
156
+ \*******************************************************/
157
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
158
+
159
+ "use strict";
160
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = __webpack_require__(/*! ../utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n var bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n var len = 0; /* a code's length in bits */\n var sym = 0; /* index of code symbols */\n var min = 0, max = 0; /* minimum and maximum code lengths */\n var root = 0; /* number of index bits for root table */\n var curr = 0; /* number of index bits for current table */\n var drop = 0; /* code bits to drop for sub-table */\n var left = 0; /* number of prefix codes available */\n var used = 0; /* code entries in table used */\n var huff = 0; /* Huffman code */\n var incr; /* for incrementing code, index */\n var fill; /* index for replicating entries */\n var low; /* low bits for current root entry */\n var mask; /* mask for low root bits */\n var next; /* next available space in table */\n var base = null; /* base value table to use */\n var base_index = 0;\n// var shoextra; /* extra bits table to use */\n var end; /* use base and extra for symbol > end */\n var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n var extra = null;\n var extra_index = 0;\n\n var here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS && used > ENOUGH_LENS) ||\n (type === DISTS && used > ENOUGH_DISTS)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLHVFQUFpQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7O0FBRTFCLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3Qiw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qix3QkFBd0I7QUFDeEIsdUJBQXVCO0FBQ3ZCO0FBQ0EscUJBQXFCO0FBQ3JCLDhCQUE4QjtBQUM5Qiw0Q0FBNEMsa0JBQWtCO0FBQzlELDJDQUEyQyxtQkFBbUI7QUFDOUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0IsVUFBVTtBQUNoQyw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsd0NBQXdDLDZCQUE2QjtBQUNyRSwwQ0FBMEM7QUFDMUMsMkNBQTJDO0FBQzNDOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGdCQUFnQixXQUFXO0FBQzNCLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUEsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSwwQkFBMEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEI7QUFDOUIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QixtQ0FBbUM7QUFDbkMsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5Qiw4QkFBOEI7QUFDOUIsNkJBQTZCO0FBQzdCLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzP2RkMjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/inftrees.js\n");
161
+
162
+ /***/ }),
163
+
164
+ /***/ "../../../node_modules/pako/lib/zlib/messages.js":
165
+ /*!*******************************************************!*\
166
+ !*** ../../../node_modules/pako/lib/zlib/messages.js ***!
167
+ \*******************************************************/
168
+ /***/ ((module) => {
169
+
170
+ "use strict";
171
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9tZXNzYWdlcy5qcz9kMjkzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgMjogICAgICAnbmVlZCBkaWN0aW9uYXJ5JywgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovXG4gIDE6ICAgICAgJ3N0cmVhbSBlbmQnLCAgICAgICAgICAvKiBaX1NUUkVBTV9FTkQgICAgICAxICAqL1xuICAwOiAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgLyogWl9PSyAgICAgICAgICAgICAgMCAgKi9cbiAgJy0xJzogICAnZmlsZSBlcnJvcicsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovXG4gICctMic6ICAgJ3N0cmVhbSBlcnJvcicsICAgICAgICAvKiBaX1NUUkVBTV9FUlJPUiAgKC0yKSAqL1xuICAnLTMnOiAgICdkYXRhIGVycm9yJywgICAgICAgICAgLyogWl9EQVRBX0VSUk9SICAgICgtMykgKi9cbiAgJy00JzogICAnaW5zdWZmaWNpZW50IG1lbW9yeScsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovXG4gICctNSc6ICAgJ2J1ZmZlciBlcnJvcicsICAgICAgICAvKiBaX0JVRl9FUlJPUiAgICAgKC01KSAqL1xuICAnLTYnOiAgICdpbmNvbXBhdGlibGUgdmVyc2lvbicgLyogWl9WRVJTSU9OX0VSUk9SICgtNikgKi9cbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/messages.js\n");
172
+
173
+ /***/ }),
174
+
175
+ /***/ "../../../node_modules/pako/lib/zlib/trees.js":
176
+ /*!****************************************************!*\
177
+ !*** ../../../node_modules/pako/lib/zlib/trees.js ***!
178
+ \****************************************************/
179
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
180
+
181
+ "use strict";
182
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = __webpack_require__(/*! ../utils/common */ \"../../../node_modules/pako/lib/utils/common.js\");\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED = 1;\n//var Z_HUFFMAN_ONLY = 2;\n//var Z_RLE = 3;\nvar Z_FIXED = 4;\n//var Z_DEFAULT_STRATEGY = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY = 0;\nvar Z_TEXT = 1;\n//var Z_ASCII = 1; // = Z_TEXT\nvar Z_UNKNOWN = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES = 30;\n/* number of distance codes */\n\nvar BL_CODES = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK = 256;\n/* end of block literal code */\n\nvar REP_3_6 = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10 = 17;\n/* repeat a zero length 3-10 times (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits = /* extra bits for each length code */\n [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits = /* extra bits for each distance code */\n [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits = /* extra bits for each bit length code */\n [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n this.static_tree = static_tree; /* static tree or NULL */\n this.extra_bits = extra_bits; /* extra bits for each code or NULL */\n this.extra_base = extra_base; /* base index for extra_bits */\n this.elems = elems; /* max number of elements in the tree */\n this.max_length = max_length; /* max bit length for the codes */\n\n // show if `static_tree` has data or dummy - needed for monomorphic objects\n this.has_stree = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n this.dyn_tree = dyn_tree; /* the dynamic tree */\n this.max_code = 0; /* largest code with non zero frequency */\n this.stat_desc = stat_desc; /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n// put_byte(s, (uch)((w) & 0xff));\n// put_byte(s, (uch)((ush)(w) >> 8));\n s.pending_buf[s.pending++] = (w) & 0xff;\n s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n if (s.bi_valid > (Buf_size - length)) {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n put_short(s, s.bi_buf);\n s.bi_buf = value >> (Buf_size - s.bi_valid);\n s.bi_valid += length - Buf_size;\n } else {\n s.bi_buf |= (value << s.bi_valid) & 0xffff;\n s.bi_valid += length;\n }\n}\n\n\nfunction send_code(s, c, tree) {\n send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n var res = 0;\n do {\n res |= code & 1;\n code >>>= 1;\n res <<= 1;\n } while (--len > 0);\n return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n if (s.bi_valid === 16) {\n put_short(s, s.bi_buf);\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n } else if (s.bi_valid >= 8) {\n s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n s.bi_buf >>= 8;\n s.bi_valid -= 8;\n }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n * above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n * array bl_count contains the frequencies for each bit length.\n * The length opt_len is updated; static_len is also updated if stree is\n * not null.\n */\nfunction gen_bitlen(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var max_code = desc.max_code;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var extra = desc.stat_desc.extra_bits;\n var base = desc.stat_desc.extra_base;\n var max_length = desc.stat_desc.max_length;\n var h; /* heap index */\n var n, m; /* iterate over the tree elements */\n var bits; /* bit length */\n var xbits; /* extra bits */\n var f; /* frequency */\n var overflow = 0; /* number of elements with bit length too large */\n\n for (bits = 0; bits <= MAX_BITS; bits++) {\n s.bl_count[bits] = 0;\n }\n\n /* In a first pass, compute the optimal bit lengths (which may\n * overflow in the case of the bit length tree).\n */\n tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n n = s.heap[h];\n bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n if (bits > max_length) {\n bits = max_length;\n overflow++;\n }\n tree[n * 2 + 1]/*.Len*/ = bits;\n /* We overwrite tree[n].Dad which is no longer needed */\n\n if (n > max_code) { continue; } /* not a leaf node */\n\n s.bl_count[bits]++;\n xbits = 0;\n if (n >= base) {\n xbits = extra[n - base];\n }\n f = tree[n * 2]/*.Freq*/;\n s.opt_len += f * (bits + xbits);\n if (has_stree) {\n s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n }\n }\n if (overflow === 0) { return; }\n\n // Trace((stderr,\"\\nbit length overflow\\n\"));\n /* This happens for example on obj2 and pic of the Calgary corpus */\n\n /* Find the first bit length which could increase: */\n do {\n bits = max_length - 1;\n while (s.bl_count[bits] === 0) { bits--; }\n s.bl_count[bits]--; /* move one leaf down the tree */\n s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n s.bl_count[max_length]--;\n /* The brother of the overflow item also moves one step up,\n * but this does not affect bl_count[max_length]\n */\n overflow -= 2;\n } while (overflow > 0);\n\n /* Now recompute all bit lengths, scanning in increasing frequency.\n * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n * lengths instead of fixing only the wrong ones. This idea is taken\n * from 'ar' written by Haruhiko Okumura.)\n */\n for (bits = max_length; bits !== 0; bits--) {\n n = s.bl_count[bits];\n while (n !== 0) {\n m = s.heap[--h];\n if (m > max_code) { continue; }\n if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n tree[m * 2 + 1]/*.Len*/ = bits;\n }\n n--;\n }\n }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n * zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n// ct_data *tree; /* the tree to decorate */\n// int max_code; /* largest code with non zero frequency */\n// ushf *bl_count; /* number of codes at each bit length */\n{\n var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n var code = 0; /* running code value */\n var bits; /* bit index */\n var n; /* code index */\n\n /* The distribution counts are first used to generate the code values\n * without bit reversal.\n */\n for (bits = 1; bits <= MAX_BITS; bits++) {\n next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n }\n /* Check that the bit counts in bl_count are consistent. The last code\n * must be all ones.\n */\n //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n // \"inconsistent bit counts\");\n //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n for (n = 0; n <= max_code; n++) {\n var len = tree[n * 2 + 1]/*.Len*/;\n if (len === 0) { continue; }\n /* Now reverse the bits */\n tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n var n; /* iterates over tree elements */\n var bits; /* bit counter */\n var length; /* length value */\n var code; /* code value */\n var dist; /* distance index */\n var bl_count = new Array(MAX_BITS + 1);\n /* number of codes at each bit length for an optimal tree */\n\n // do check in _tr_init()\n //if (static_init_done) return;\n\n /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n static_l_desc.static_tree = static_ltree;\n static_l_desc.extra_bits = extra_lbits;\n static_d_desc.static_tree = static_dtree;\n static_d_desc.extra_bits = extra_dbits;\n static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n /* Initialize the mapping length (0..255) -> length code (0..28) */\n length = 0;\n for (code = 0; code < LENGTH_CODES - 1; code++) {\n base_length[code] = length;\n for (n = 0; n < (1 << extra_lbits[code]); n++) {\n _length_code[length++] = code;\n }\n }\n //Assert (length == 256, \"tr_static_init: length != 256\");\n /* Note that the length 255 (match length 258) can be represented\n * in two different ways: code 284 + 5 bits or code 285, so we\n * overwrite length_code[255] to use the best encoding:\n */\n _length_code[length - 1] = code;\n\n /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n dist = 0;\n for (code = 0; code < 16; code++) {\n base_dist[code] = dist;\n for (n = 0; n < (1 << extra_dbits[code]); n++) {\n _dist_code[dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: dist != 256\");\n dist >>= 7; /* from now on, all distances are divided by 128 */\n for (; code < D_CODES; code++) {\n base_dist[code] = dist << 7;\n for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n _dist_code[256 + dist++] = code;\n }\n }\n //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n /* Construct the codes of the static literal tree */\n for (bits = 0; bits <= MAX_BITS; bits++) {\n bl_count[bits] = 0;\n }\n\n n = 0;\n while (n <= 143) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n while (n <= 255) {\n static_ltree[n * 2 + 1]/*.Len*/ = 9;\n n++;\n bl_count[9]++;\n }\n while (n <= 279) {\n static_ltree[n * 2 + 1]/*.Len*/ = 7;\n n++;\n bl_count[7]++;\n }\n while (n <= 287) {\n static_ltree[n * 2 + 1]/*.Len*/ = 8;\n n++;\n bl_count[8]++;\n }\n /* Codes 286 and 287 do not exist, but we must include them in the\n * tree construction to get a canonical Huffman tree (longest code\n * all ones)\n */\n gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n /* The static distance tree is trivial: */\n for (n = 0; n < D_CODES; n++) {\n static_dtree[n * 2 + 1]/*.Len*/ = 5;\n static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n }\n\n // Now data ready and we can init static trees\n static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);\n static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);\n\n //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n var n; /* iterates over tree elements */\n\n /* Initialize the trees. */\n for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n s.opt_len = s.static_len = 0;\n s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n if (s.bi_valid > 8) {\n put_short(s, s.bi_buf);\n } else if (s.bi_valid > 0) {\n //put_byte(s, (Byte)s->bi_buf);\n s.pending_buf[s.pending++] = s.bi_buf;\n }\n s.bi_buf = 0;\n s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf *buf; /* the input data */\n//unsigned len; /* its length */\n//int header; /* true if block header must be written */\n{\n bi_windup(s); /* align on byte boundary */\n\n if (header) {\n put_short(s, len);\n put_short(s, ~len);\n }\n// while (len--) {\n// put_byte(s, *buf++);\n// }\n utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n var _n2 = n * 2;\n var _m2 = m * 2;\n return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n// deflate_state *s;\n// ct_data *tree; /* the tree to restore */\n// int k; /* node to move down */\n{\n var v = s.heap[k];\n var j = k << 1; /* left son of k */\n while (j <= s.heap_len) {\n /* Set j to the smallest of the two sons: */\n if (j < s.heap_len &&\n smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n j++;\n }\n /* Exit if v is smaller than both sons */\n if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n /* Exchange v with the smallest son */\n s.heap[k] = s.heap[j];\n k = j;\n\n /* And continue down the tree, setting j to the left son of k */\n j <<= 1;\n }\n s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n// deflate_state *s;\n// const ct_data *ltree; /* literal tree */\n// const ct_data *dtree; /* distance tree */\n{\n var dist; /* distance of matched string */\n var lc; /* match length or unmatched char (if dist == 0) */\n var lx = 0; /* running index in l_buf */\n var code; /* the code to send */\n var extra; /* number of extra bits to send */\n\n if (s.last_lit !== 0) {\n do {\n dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n lc = s.pending_buf[s.l_buf + lx];\n lx++;\n\n if (dist === 0) {\n send_code(s, lc, ltree); /* send a literal byte */\n //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n } else {\n /* Here, lc is the match length - MIN_MATCH */\n code = _length_code[lc];\n send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n extra = extra_lbits[code];\n if (extra !== 0) {\n lc -= base_length[code];\n send_bits(s, lc, extra); /* send the extra length bits */\n }\n dist--; /* dist is now the match distance - 1 */\n code = d_code(dist);\n //Assert (code < D_CODES, \"bad d_code\");\n\n send_code(s, code, dtree); /* send the distance code */\n extra = extra_dbits[code];\n if (extra !== 0) {\n dist -= base_dist[code];\n send_bits(s, dist, extra); /* send the extra distance bits */\n }\n } /* literal or match pair ? */\n\n /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n // \"pendingBuf overflow\");\n\n } while (lx < s.last_lit);\n }\n\n send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n * and corresponding code. The length opt_len is updated; static_len is\n * also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n// deflate_state *s;\n// tree_desc *desc; /* the tree descriptor */\n{\n var tree = desc.dyn_tree;\n var stree = desc.stat_desc.static_tree;\n var has_stree = desc.stat_desc.has_stree;\n var elems = desc.stat_desc.elems;\n var n, m; /* iterate over heap elements */\n var max_code = -1; /* largest code with non zero frequency */\n var node; /* new node being created */\n\n /* Construct the initial heap, with least frequent element in\n * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n * heap[0] is not used.\n */\n s.heap_len = 0;\n s.heap_max = HEAP_SIZE;\n\n for (n = 0; n < elems; n++) {\n if (tree[n * 2]/*.Freq*/ !== 0) {\n s.heap[++s.heap_len] = max_code = n;\n s.depth[n] = 0;\n\n } else {\n tree[n * 2 + 1]/*.Len*/ = 0;\n }\n }\n\n /* The pkzip format requires that at least one distance code exists,\n * and that at least one bit should be sent even if there is only one\n * possible code. So to avoid special checks later on we force at least\n * two codes of non zero frequency.\n */\n while (s.heap_len < 2) {\n node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n tree[node * 2]/*.Freq*/ = 1;\n s.depth[node] = 0;\n s.opt_len--;\n\n if (has_stree) {\n s.static_len -= stree[node * 2 + 1]/*.Len*/;\n }\n /* node is 0 or 1 so it does not have extra bits */\n }\n desc.max_code = max_code;\n\n /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n * establish sub-heaps of increasing lengths:\n */\n for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n /* Construct the Huffman tree by repeatedly combining the least two\n * frequent nodes.\n */\n node = elems; /* next internal node of the tree */\n do {\n //pqremove(s, tree, n); /* n = node of least frequency */\n /*** pqremove ***/\n n = s.heap[1/*SMALLEST*/];\n s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n pqdownheap(s, tree, 1/*SMALLEST*/);\n /***/\n\n m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n s.heap[--s.heap_max] = m;\n\n /* Create a new node father of n and m */\n tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n /* and insert the new node in the heap */\n s.heap[1/*SMALLEST*/] = node++;\n pqdownheap(s, tree, 1/*SMALLEST*/);\n\n } while (s.heap_len >= 2);\n\n s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n /* At this point, the fields freq and dad are set. We can now\n * generate the bit lengths.\n */\n gen_bitlen(s, desc);\n\n /* The field len is now set, we can generate the bit codes */\n gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n } else if (curlen !== 0) {\n\n if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n } else if (count <= 10) {\n s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n } else {\n s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n }\n\n count = 0;\n prevlen = curlen;\n\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n// deflate_state *s;\n// ct_data *tree; /* the tree to be scanned */\n// int max_code; /* and its largest code of non zero frequency */\n{\n var n; /* iterates over all tree elements */\n var prevlen = -1; /* last emitted length */\n var curlen; /* length of current code */\n\n var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n var count = 0; /* repeat count of the current code */\n var max_count = 7; /* max repeat count */\n var min_count = 4; /* min repeat count */\n\n /* tree[max_code+1].Len = -1; */ /* guard already set */\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n }\n\n for (n = 0; n <= max_code; n++) {\n curlen = nextlen;\n nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n if (++count < max_count && curlen === nextlen) {\n continue;\n\n } else if (count < min_count) {\n do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n } else if (curlen !== 0) {\n if (curlen !== prevlen) {\n send_code(s, curlen, s.bl_tree);\n count--;\n }\n //Assert(count >= 3 && count <= 6, \" 3_6?\");\n send_code(s, REP_3_6, s.bl_tree);\n send_bits(s, count - 3, 2);\n\n } else if (count <= 10) {\n send_code(s, REPZ_3_10, s.bl_tree);\n send_bits(s, count - 3, 3);\n\n } else {\n send_code(s, REPZ_11_138, s.bl_tree);\n send_bits(s, count - 11, 7);\n }\n\n count = 0;\n prevlen = curlen;\n if (nextlen === 0) {\n max_count = 138;\n min_count = 3;\n\n } else if (curlen === nextlen) {\n max_count = 6;\n min_count = 3;\n\n } else {\n max_count = 7;\n min_count = 4;\n }\n }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n var max_blindex; /* index of last bit length code of non zero freq */\n\n /* Determine the bit length frequencies for literal and distance trees */\n scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n /* Build the bit length tree: */\n build_tree(s, s.bl_desc);\n /* opt_len now includes the length of the tree representations, except\n * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n */\n\n /* Determine the number of bit length codes to send. The pkzip format\n * requires that at least 4 bit length codes be sent. (appnote.txt says\n * 3 but the actual value used is 4.)\n */\n for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n break;\n }\n }\n /* Update opt_len to include the bit length tree and counts */\n s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n // s->opt_len, s->static_len));\n\n return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n// deflate_state *s;\n// int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n var rank; /* index in bl_order */\n\n //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n // \"too many codes\");\n //Tracev((stderr, \"\\nbl counts: \"));\n send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n send_bits(s, dcodes - 1, 5);\n send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */\n for (rank = 0; rank < blcodes; rank++) {\n //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n }\n //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n * a) There are no non-portable control characters belonging to the\n * \"black list\" (0..6, 14..25, 28..31).\n * b) There is at least one printable character belonging to the\n * \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n * \"gray list\" that is ignored in this detection algorithm:\n * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n /* black_mask is the bit mask of black-listed bytes\n * set bits 0..6, 14..25, and 28..31\n * 0xf3ffc07f = binary 11110011111111111100000001111111\n */\n var black_mask = 0xf3ffc07f;\n var n;\n\n /* Check for non-textual (\"black-listed\") bytes. */\n for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n return Z_BINARY;\n }\n }\n\n /* Check for textual (\"white-listed\") bytes. */\n if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n for (n = 32; n < LITERALS; n++) {\n if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n return Z_TEXT;\n }\n }\n\n /* There are no \"black-listed\" or \"white-listed\" bytes:\n * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n */\n return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n if (!static_init_done) {\n tr_static_init();\n static_init_done = true;\n }\n\n s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);\n s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);\n s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n s.bi_buf = 0;\n s.bi_valid = 0;\n\n /* Initialize the first block of the first file: */\n init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */\n copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n send_bits(s, STATIC_TREES << 1, 3);\n send_code(s, END_BLOCK, static_ltree);\n bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf; /* input block, or NULL if too old */\n//ulg stored_len; /* length of input block */\n//int last; /* one if this is the last block for a file */\n{\n var opt_lenb, static_lenb; /* opt_len and static_len in bytes */\n var max_blindex = 0; /* index of last bit length code of non zero freq */\n\n /* Build the Huffman trees unless a stored block is forced */\n if (s.level > 0) {\n\n /* Check if the file is binary or text */\n if (s.strm.data_type === Z_UNKNOWN) {\n s.strm.data_type = detect_data_type(s);\n }\n\n /* Construct the literal and distance trees */\n build_tree(s, s.l_desc);\n // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n\n build_tree(s, s.d_desc);\n // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n // s->static_len));\n /* At this point, opt_len and static_len are the total bit lengths of\n * the compressed block data, excluding the tree representations.\n */\n\n /* Build the bit length tree for the above two trees, and get the index\n * in bl_order of the last bit length code to send.\n */\n max_blindex = build_bl_tree(s);\n\n /* Determine the best encoding. Compute the block lengths in bytes. */\n opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n // s->last_lit));\n\n if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n } else {\n // Assert(buf != (char*)0, \"lost buf\");\n opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n }\n\n if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n /* 4: two words for the lengths */\n\n /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n * Otherwise we can't have processed more than WSIZE input bytes since\n * the last block flush, because compression would have been\n * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n * transform a block into a stored block.\n */\n _tr_stored_block(s, buf, stored_len, last);\n\n } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n compress_block(s, static_ltree, static_dtree);\n\n } else {\n send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n compress_block(s, s.dyn_ltree, s.dyn_dtree);\n }\n // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n /* The above check is made mod 2^32, for files larger than 512 MB\n * and uLong implemented on 32 bits.\n */\n init_block(s);\n\n if (last) {\n bi_windup(s);\n }\n // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n // s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n// deflate_state *s;\n// unsigned dist; /* distance of matched string */\n// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n //var out_length, in_length, dcode;\n\n s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff;\n s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n s.last_lit++;\n\n if (dist === 0) {\n /* lc is the unmatched char */\n s.dyn_ltree[lc * 2]/*.Freq*/++;\n } else {\n s.matches++;\n /* Here, lc is the match length - MIN_MATCH */\n dist--; /* dist = match distance - 1 */\n //Assert((ush)dist < (ush)MAX_DIST(s) &&\n // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n // (ush)d_code(dist) < (ush)D_CODES, \"_tr_tally: bad match\");\n\n s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n// /* Try to guess if it is profitable to stop the current block here */\n// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n// /* Compute an upper bound for the compressed length */\n// out_length = s.last_lit*8;\n// in_length = s.strstart - s.block_start;\n//\n// for (dcode = 0; dcode < D_CODES; dcode++) {\n// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n// }\n// out_length >>>= 3;\n// //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n// // s->last_lit, in_length, out_length,\n// // 100L - out_length*100L/in_length));\n// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n// return true;\n// }\n// }\n//#endif\n\n return (s.last_lit === s.lit_bufsize - 1);\n /* We avoid equality with lit_bufsize because of wraparound at 64K\n * on 16 bit machines and because stored blocks are restricted to\n * 64K-1 bytes.\n */\n}\n\nexports._tr_init = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvdHJlZXMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLHVFQUFpQjs7QUFFckM7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7O0FBRUE7OztBQUdBLHFCQUFxQixzQkFBc0IscUJBQXFCOztBQUVoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQSxvQ0FBb0M7QUFDcEMsb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7OztBQUdB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QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1DQUFtQzs7QUFFbkMsSUFBSTtBQUNKO0FBQ0EsNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTs7QUFFSjtBQUNBOztBQUVBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0I7QUFDaEIsd0JBQXdCO0FBQ3hCLHVCQUF1QjtBQUN2QixpQkFBaUI7QUFDakIsaUJBQWlCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzP2UwZTAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8qIGVzbGludC1kaXNhYmxlIHNwYWNlLXVuYXJ5LW9wcyAqL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zdGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmF1bHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/trees.js\n");
183
+
184
+ /***/ }),
185
+
186
+ /***/ "../../../node_modules/pako/lib/zlib/zstream.js":
187
+ /*!******************************************************!*\
188
+ !*** ../../../node_modules/pako/lib/zlib/zstream.js ***!
189
+ \******************************************************/
190
+ /***/ ((module) => {
191
+
192
+ "use strict";
193
+ eval("\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n// claim that you wrote the original software. If you use this software\n// in a product, an acknowledgment in the product documentation would be\n// appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n// misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n}\n\nmodule.exports = ZStream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanM/YzVlYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/pako/lib/zlib/zstream.js\n");
194
+
195
+ /***/ }),
196
+
197
+ /***/ "../../../node_modules/png-chunk-text/decode.js":
198
+ /*!******************************************************!*\
199
+ !*** ../../../node_modules/png-chunk-text/decode.js ***!
200
+ \******************************************************/
201
+ /***/ ((module) => {
202
+
203
+ eval("module.exports = decode\n\nfunction decode (data) {\n if (data.data && data.name) {\n data = data.data\n }\n\n var naming = true\n var text = ''\n var name = ''\n\n for (var i = 0; i < data.length; i++) {\n var code = data[i]\n\n if (naming) {\n if (code) {\n name += String.fromCharCode(code)\n } else {\n naming = false\n }\n } else {\n if (code) {\n text += String.fromCharCode(code)\n } else {\n throw new Error('Invalid NULL character found. 0x00 character is not permitted in tEXt content')\n }\n }\n }\n\n return {\n keyword: name,\n text: text\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVuay10ZXh0L2RlY29kZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVuay10ZXh0L2RlY29kZS5qcz81MTBjIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZGVjb2RlXG5cbmZ1bmN0aW9uIGRlY29kZSAoZGF0YSkge1xuICBpZiAoZGF0YS5kYXRhICYmIGRhdGEubmFtZSkge1xuICAgIGRhdGEgPSBkYXRhLmRhdGFcbiAgfVxuXG4gIHZhciBuYW1pbmcgPSB0cnVlXG4gIHZhciB0ZXh0ID0gJydcbiAgdmFyIG5hbWUgPSAnJ1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb2RlID0gZGF0YVtpXVxuXG4gICAgaWYgKG5hbWluZykge1xuICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgbmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1pbmcgPSBmYWxzZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICB0ZXh0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOVUxMIGNoYXJhY3RlciBmb3VuZC4gMHgwMCBjaGFyYWN0ZXIgaXMgbm90IHBlcm1pdHRlZCBpbiB0RVh0IGNvbnRlbnQnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2V5d29yZDogbmFtZSxcbiAgICB0ZXh0OiB0ZXh0XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/png-chunk-text/decode.js\n");
204
+
205
+ /***/ }),
206
+
207
+ /***/ "../../../node_modules/png-chunk-text/encode.js":
208
+ /*!******************************************************!*\
209
+ !*** ../../../node_modules/png-chunk-text/encode.js ***!
210
+ \******************************************************/
211
+ /***/ ((module) => {
212
+
213
+ eval("module.exports = encode\n\nfunction encode (keyword, content) {\n keyword = String(keyword)\n content = String(content)\n\n if (!/^[\\x00-\\xFF]+$/.test(keyword) || !/^[\\x00-\\xFF]+$/.test(content)) {\n throw new Error('Only Latin-1 characters are permitted in PNG tEXt chunks. You might want to consider base64 encoding and/or zEXt compression')\n }\n\n if (keyword.length >= 80) {\n throw new Error('Keyword \"' + keyword + '\" is longer than the 79-character limit imposed by the PNG specification')\n }\n\n var totalSize = keyword.length + content.length + 1\n var output = new Uint8Array(totalSize)\n var idx = 0\n var code\n\n for (var i = 0; i < keyword.length; i++) {\n if (!(code = keyword.charCodeAt(i))) {\n throw new Error('0x00 character is not permitted in tEXt keywords')\n }\n\n output[idx++] = code\n }\n\n output[idx++] = 0\n\n for (var j = 0; j < content.length; j++) {\n if (!(code = content.charCodeAt(j))) {\n throw new Error('0x00 character is not permitted in tEXt content')\n }\n\n output[idx++] = code\n }\n\n return {\n name: 'tEXt',\n data: output\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVuay10ZXh0L2VuY29kZS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcG5nLWNodW5rLXRleHQvZW5jb2RlLmpzPzU5NzEiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBlbmNvZGVcblxuZnVuY3Rpb24gZW5jb2RlIChrZXl3b3JkLCBjb250ZW50KSB7XG4gIGtleXdvcmQgPSBTdHJpbmcoa2V5d29yZClcbiAgY29udGVudCA9IFN0cmluZyhjb250ZW50KVxuXG4gIGlmICghL15bXFx4MDAtXFx4RkZdKyQvLnRlc3Qoa2V5d29yZCkgfHwgIS9eW1xceDAwLVxceEZGXSskLy50ZXN0KGNvbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IExhdGluLTEgY2hhcmFjdGVycyBhcmUgcGVybWl0dGVkIGluIFBORyB0RVh0IGNodW5rcy4gWW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgYmFzZTY0IGVuY29kaW5nIGFuZC9vciB6RVh0IGNvbXByZXNzaW9uJylcbiAgfVxuXG4gIGlmIChrZXl3b3JkLmxlbmd0aCA+PSA4MCkge1xuICAgIHRocm93IG5ldyBFcnJvcignS2V5d29yZCBcIicgKyBrZXl3b3JkICsgJ1wiIGlzIGxvbmdlciB0aGFuIHRoZSA3OS1jaGFyYWN0ZXIgbGltaXQgaW1wb3NlZCBieSB0aGUgUE5HIHNwZWNpZmljYXRpb24nKVxuICB9XG5cbiAgdmFyIHRvdGFsU2l6ZSA9IGtleXdvcmQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxXG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDhBcnJheSh0b3RhbFNpemUpXG4gIHZhciBpZHggPSAwXG4gIHZhciBjb2RlXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXl3b3JkLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCEoY29kZSA9IGtleXdvcmQuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignMHgwMCBjaGFyYWN0ZXIgaXMgbm90IHBlcm1pdHRlZCBpbiB0RVh0IGtleXdvcmRzJylcbiAgICB9XG5cbiAgICBvdXRwdXRbaWR4KytdID0gY29kZVxuICB9XG5cbiAgb3V0cHV0W2lkeCsrXSA9IDBcblxuICBmb3IgKHZhciBqID0gMDsgaiA8IGNvbnRlbnQubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAoIShjb2RlID0gY29udGVudC5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCcweDAwIGNoYXJhY3RlciBpcyBub3QgcGVybWl0dGVkIGluIHRFWHQgY29udGVudCcpXG4gICAgfVxuXG4gICAgb3V0cHV0W2lkeCsrXSA9IGNvZGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3RFWHQnLFxuICAgIGRhdGE6IG91dHB1dFxuICB9XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/png-chunk-text/encode.js\n");
214
+
215
+ /***/ }),
216
+
217
+ /***/ "../../../node_modules/png-chunk-text/index.js":
218
+ /*!*****************************************************!*\
219
+ !*** ../../../node_modules/png-chunk-text/index.js ***!
220
+ \*****************************************************/
221
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
222
+
223
+ eval("exports.encode = __webpack_require__(/*! ./encode */ \"../../../node_modules/png-chunk-text/encode.js\")\nexports.decode = __webpack_require__(/*! ./decode */ \"../../../node_modules/png-chunk-text/decode.js\")\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVuay10ZXh0L2luZGV4LmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBLHNHQUFvQztBQUNwQyxzR0FBb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVuay10ZXh0L2luZGV4LmpzPzNiMzAiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5lbmNvZGUgPSByZXF1aXJlKCcuL2VuY29kZScpXG5leHBvcnRzLmRlY29kZSA9IHJlcXVpcmUoJy4vZGVjb2RlJylcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/png-chunk-text/index.js\n");
224
+
225
+ /***/ }),
226
+
227
+ /***/ "../../../node_modules/png-chunks-encode/index.js":
228
+ /*!********************************************************!*\
229
+ !*** ../../../node_modules/png-chunks-encode/index.js ***!
230
+ \********************************************************/
231
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
232
+
233
+ eval("var sliced = __webpack_require__(/*! sliced */ \"../../../node_modules/sliced/index.js\")\nvar crc32 = __webpack_require__(/*! crc-32 */ \"../../../node_modules/crc-32/crc32.js\")\n\nmodule.exports = encodeChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction encodeChunks (chunks) {\n var totalSize = 8\n var idx = totalSize\n var i\n\n for (i = 0; i < chunks.length; i++) {\n totalSize += chunks[i].data.length\n totalSize += 12\n }\n\n var output = new Uint8Array(totalSize)\n\n output[0] = 0x89\n output[1] = 0x50\n output[2] = 0x4E\n output[3] = 0x47\n output[4] = 0x0D\n output[5] = 0x0A\n output[6] = 0x1A\n output[7] = 0x0A\n\n for (i = 0; i < chunks.length; i++) {\n var chunk = chunks[i]\n var name = chunk.name\n var data = chunk.data\n var size = data.length\n var nameChars = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ]\n\n uint32[0] = size\n output[idx++] = uint8[3]\n output[idx++] = uint8[2]\n output[idx++] = uint8[1]\n output[idx++] = uint8[0]\n\n output[idx++] = nameChars[0]\n output[idx++] = nameChars[1]\n output[idx++] = nameChars[2]\n output[idx++] = nameChars[3]\n\n for (var j = 0; j < size;) {\n output[idx++] = data[j++]\n }\n\n var crcCheck = nameChars.concat(sliced(data))\n var crc = crc32.buf(crcCheck)\n\n int32[0] = crc\n output[idx++] = uint8[3]\n output[idx++] = uint8[2]\n output[idx++] = uint8[1]\n output[idx++] = uint8[0]\n }\n\n return output\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVua3MtZW5jb2RlL2luZGV4LmpzLmpzIiwibWFwcGluZ3MiOiJBQUFBLGFBQWEsbUJBQU8sQ0FBQyxxREFBUTtBQUM3QixZQUFZLG1CQUFPLENBQUMscURBQVE7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcG5nLWNodW5rcy1lbmNvZGUvaW5kZXguanM/YmVhNiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgc2xpY2VkID0gcmVxdWlyZSgnc2xpY2VkJylcbnZhciBjcmMzMiA9IHJlcXVpcmUoJ2NyYy0zMicpXG5cbm1vZHVsZS5leHBvcnRzID0gZW5jb2RlQ2h1bmtzXG5cbi8vIFVzZWQgZm9yIGZhc3QtaXNoIGNvbnZlcnNpb24gYmV0d2VlbiB1aW50OHMgYW5kIHVpbnQzMnMvaW50MzJzLlxuLy8gQWxzbyByZXF1aXJlZCBpbiBvcmRlciB0byByZW1haW4gYWdub3N0aWMgZm9yIGJvdGggTm9kZSBCdWZmZXJzIGFuZFxuLy8gVWludDhBcnJheXMuXG52YXIgdWludDggPSBuZXcgVWludDhBcnJheSg0KVxudmFyIGludDMyID0gbmV3IEludDMyQXJyYXkodWludDguYnVmZmVyKVxudmFyIHVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh1aW50OC5idWZmZXIpXG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rcyAoY2h1bmtzKSB7XG4gIHZhciB0b3RhbFNpemUgPSA4XG4gIHZhciBpZHggPSB0b3RhbFNpemVcbiAgdmFyIGlcblxuICBmb3IgKGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdG90YWxTaXplICs9IGNodW5rc1tpXS5kYXRhLmxlbmd0aFxuICAgIHRvdGFsU2l6ZSArPSAxMlxuICB9XG5cbiAgdmFyIG91dHB1dCA9IG5ldyBVaW50OEFycmF5KHRvdGFsU2l6ZSlcblxuICBvdXRwdXRbMF0gPSAweDg5XG4gIG91dHB1dFsxXSA9IDB4NTBcbiAgb3V0cHV0WzJdID0gMHg0RVxuICBvdXRwdXRbM10gPSAweDQ3XG4gIG91dHB1dFs0XSA9IDB4MERcbiAgb3V0cHV0WzVdID0gMHgwQVxuICBvdXRwdXRbNl0gPSAweDFBXG4gIG91dHB1dFs3XSA9IDB4MEFcblxuICBmb3IgKGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNodW5rID0gY2h1bmtzW2ldXG4gICAgdmFyIG5hbWUgPSBjaHVuay5uYW1lXG4gICAgdmFyIGRhdGEgPSBjaHVuay5kYXRhXG4gICAgdmFyIHNpemUgPSBkYXRhLmxlbmd0aFxuICAgIHZhciBuYW1lQ2hhcnMgPSBbXG4gICAgICBuYW1lLmNoYXJDb2RlQXQoMCksXG4gICAgICBuYW1lLmNoYXJDb2RlQXQoMSksXG4gICAgICBuYW1lLmNoYXJDb2RlQXQoMiksXG4gICAgICBuYW1lLmNoYXJDb2RlQXQoMylcbiAgICBdXG5cbiAgICB1aW50MzJbMF0gPSBzaXplXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzNdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzJdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzFdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzBdXG5cbiAgICBvdXRwdXRbaWR4KytdID0gbmFtZUNoYXJzWzBdXG4gICAgb3V0cHV0W2lkeCsrXSA9IG5hbWVDaGFyc1sxXVxuICAgIG91dHB1dFtpZHgrK10gPSBuYW1lQ2hhcnNbMl1cbiAgICBvdXRwdXRbaWR4KytdID0gbmFtZUNoYXJzWzNdXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNpemU7KSB7XG4gICAgICBvdXRwdXRbaWR4KytdID0gZGF0YVtqKytdXG4gICAgfVxuXG4gICAgdmFyIGNyY0NoZWNrID0gbmFtZUNoYXJzLmNvbmNhdChzbGljZWQoZGF0YSkpXG4gICAgdmFyIGNyYyA9IGNyYzMyLmJ1ZihjcmNDaGVjaylcblxuICAgIGludDMyWzBdID0gY3JjXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzNdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzJdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzFdXG4gICAgb3V0cHV0W2lkeCsrXSA9IHVpbnQ4WzBdXG4gIH1cblxuICByZXR1cm4gb3V0cHV0XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/png-chunks-encode/index.js\n");
234
+
235
+ /***/ }),
236
+
237
+ /***/ "../../../node_modules/png-chunks-extract/index.js":
238
+ /*!*********************************************************!*\
239
+ !*** ../../../node_modules/png-chunks-extract/index.js ***!
240
+ \*********************************************************/
241
+ /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
242
+
243
+ eval("var crc32 = __webpack_require__(/*! crc-32 */ \"../../../node_modules/crc-32/crc32.js\")\n\nmodule.exports = extractChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction extractChunks (data) {\n if (data[0] !== 0x89) throw new Error('Invalid .png file header')\n if (data[1] !== 0x50) throw new Error('Invalid .png file header')\n if (data[2] !== 0x4E) throw new Error('Invalid .png file header')\n if (data[3] !== 0x47) throw new Error('Invalid .png file header')\n if (data[4] !== 0x0D) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n if (data[5] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n if (data[6] !== 0x1A) throw new Error('Invalid .png file header')\n if (data[7] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n\n var ended = false\n var chunks = []\n var idx = 8\n\n while (idx < data.length) {\n // Read the length of the current chunk,\n // which is stored as a Uint32.\n uint8[3] = data[idx++]\n uint8[2] = data[idx++]\n uint8[1] = data[idx++]\n uint8[0] = data[idx++]\n\n // Chunk includes name/type for CRC check (see below).\n var length = uint32[0] + 4\n var chunk = new Uint8Array(length)\n chunk[0] = data[idx++]\n chunk[1] = data[idx++]\n chunk[2] = data[idx++]\n chunk[3] = data[idx++]\n\n // Get the name in ASCII for identification.\n var name = (\n String.fromCharCode(chunk[0]) +\n String.fromCharCode(chunk[1]) +\n String.fromCharCode(chunk[2]) +\n String.fromCharCode(chunk[3])\n )\n\n // The IHDR header MUST come first.\n if (!chunks.length && name !== 'IHDR') {\n throw new Error('IHDR header missing')\n }\n\n // The IEND header marks the end of the file,\n // so on discovering it break out of the loop.\n if (name === 'IEND') {\n ended = true\n chunks.push({\n name: name,\n data: new Uint8Array(0)\n })\n\n break\n }\n\n // Read the contents of the chunk out of the main buffer.\n for (var i = 4; i < length; i++) {\n chunk[i] = data[idx++]\n }\n\n // Read out the CRC value for comparison.\n // It's stored as an Int32.\n uint8[3] = data[idx++]\n uint8[2] = data[idx++]\n uint8[1] = data[idx++]\n uint8[0] = data[idx++]\n\n var crcActual = int32[0]\n var crcExpect = crc32.buf(chunk)\n if (crcExpect !== crcActual) {\n throw new Error(\n 'CRC values for ' + name + ' header do not match, PNG file is likely corrupted'\n )\n }\n\n // The chunk data is now copied to remove the 4 preceding\n // bytes used for the chunk name/type.\n var chunkData = new Uint8Array(chunk.buffer.slice(4))\n\n chunks.push({\n name: name,\n data: chunkData\n })\n }\n\n if (!ended) {\n throw new Error('.png file ended prematurely: no IEND header was found')\n }\n\n return chunks\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3BuZy1jaHVua3MtZXh0cmFjdC9pbmRleC5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMscURBQVE7O0FBRTVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcG5nLWNodW5rcy1leHRyYWN0L2luZGV4LmpzPzhhYzUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNyYzMyID0gcmVxdWlyZSgnY3JjLTMyJylcblxubW9kdWxlLmV4cG9ydHMgPSBleHRyYWN0Q2h1bmtzXG5cbi8vIFVzZWQgZm9yIGZhc3QtaXNoIGNvbnZlcnNpb24gYmV0d2VlbiB1aW50OHMgYW5kIHVpbnQzMnMvaW50MzJzLlxuLy8gQWxzbyByZXF1aXJlZCBpbiBvcmRlciB0byByZW1haW4gYWdub3N0aWMgZm9yIGJvdGggTm9kZSBCdWZmZXJzIGFuZFxuLy8gVWludDhBcnJheXMuXG52YXIgdWludDggPSBuZXcgVWludDhBcnJheSg0KVxudmFyIGludDMyID0gbmV3IEludDMyQXJyYXkodWludDguYnVmZmVyKVxudmFyIHVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh1aW50OC5idWZmZXIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RDaHVua3MgKGRhdGEpIHtcbiAgaWYgKGRhdGFbMF0gIT09IDB4ODkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCAucG5nIGZpbGUgaGVhZGVyJylcbiAgaWYgKGRhdGFbMV0gIT09IDB4NTApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCAucG5nIGZpbGUgaGVhZGVyJylcbiAgaWYgKGRhdGFbMl0gIT09IDB4NEUpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCAucG5nIGZpbGUgaGVhZGVyJylcbiAgaWYgKGRhdGFbM10gIT09IDB4NDcpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCAucG5nIGZpbGUgaGVhZGVyJylcbiAgaWYgKGRhdGFbNF0gIT09IDB4MEQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCAucG5nIGZpbGUgaGVhZGVyOiBwb3NzaWJseSBjYXVzZWQgYnkgRE9TLVVuaXggbGluZSBlbmRpbmcgY29udmVyc2lvbj8nKVxuICBpZiAoZGF0YVs1XSAhPT0gMHgwQSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIC5wbmcgZmlsZSBoZWFkZXI6IHBvc3NpYmx5IGNhdXNlZCBieSBET1MtVW5peCBsaW5lIGVuZGluZyBjb252ZXJzaW9uPycpXG4gIGlmIChkYXRhWzZdICE9PSAweDFBKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgLnBuZyBmaWxlIGhlYWRlcicpXG4gIGlmIChkYXRhWzddICE9PSAweDBBKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgLnBuZyBmaWxlIGhlYWRlcjogcG9zc2libHkgY2F1c2VkIGJ5IERPUy1Vbml4IGxpbmUgZW5kaW5nIGNvbnZlcnNpb24/JylcblxuICB2YXIgZW5kZWQgPSBmYWxzZVxuICB2YXIgY2h1bmtzID0gW11cbiAgdmFyIGlkeCA9IDhcblxuICB3aGlsZSAoaWR4IDwgZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgY2h1bmssXG4gICAgLy8gd2hpY2ggaXMgc3RvcmVkIGFzIGEgVWludDMyLlxuICAgIHVpbnQ4WzNdID0gZGF0YVtpZHgrK11cbiAgICB1aW50OFsyXSA9IGRhdGFbaWR4KytdXG4gICAgdWludDhbMV0gPSBkYXRhW2lkeCsrXVxuICAgIHVpbnQ4WzBdID0gZGF0YVtpZHgrK11cblxuICAgIC8vIENodW5rIGluY2x1ZGVzIG5hbWUvdHlwZSBmb3IgQ1JDIGNoZWNrIChzZWUgYmVsb3cpLlxuICAgIHZhciBsZW5ndGggPSB1aW50MzJbMF0gKyA0XG4gICAgdmFyIGNodW5rID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIGNodW5rWzBdID0gZGF0YVtpZHgrK11cbiAgICBjaHVua1sxXSA9IGRhdGFbaWR4KytdXG4gICAgY2h1bmtbMl0gPSBkYXRhW2lkeCsrXVxuICAgIGNodW5rWzNdID0gZGF0YVtpZHgrK11cblxuICAgIC8vIEdldCB0aGUgbmFtZSBpbiBBU0NJSSBmb3IgaWRlbnRpZmljYXRpb24uXG4gICAgdmFyIG5hbWUgPSAoXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rWzBdKSArXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rWzFdKSArXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rWzJdKSArXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGNodW5rWzNdKVxuICAgIClcblxuICAgIC8vIFRoZSBJSERSIGhlYWRlciBNVVNUIGNvbWUgZmlyc3QuXG4gICAgaWYgKCFjaHVua3MubGVuZ3RoICYmIG5hbWUgIT09ICdJSERSJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJSERSIGhlYWRlciBtaXNzaW5nJylcbiAgICB9XG5cbiAgICAvLyBUaGUgSUVORCBoZWFkZXIgbWFya3MgdGhlIGVuZCBvZiB0aGUgZmlsZSxcbiAgICAvLyBzbyBvbiBkaXNjb3ZlcmluZyBpdCBicmVhayBvdXQgb2YgdGhlIGxvb3AuXG4gICAgaWYgKG5hbWUgPT09ICdJRU5EJykge1xuICAgICAgZW5kZWQgPSB0cnVlXG4gICAgICBjaHVua3MucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDApXG4gICAgICB9KVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaHVuayBvdXQgb2YgdGhlIG1haW4gYnVmZmVyLlxuICAgIGZvciAodmFyIGkgPSA0OyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGNodW5rW2ldID0gZGF0YVtpZHgrK11cbiAgICB9XG5cbiAgICAvLyBSZWFkIG91dCB0aGUgQ1JDIHZhbHVlIGZvciBjb21wYXJpc29uLlxuICAgIC8vIEl0J3Mgc3RvcmVkIGFzIGFuIEludDMyLlxuICAgIHVpbnQ4WzNdID0gZGF0YVtpZHgrK11cbiAgICB1aW50OFsyXSA9IGRhdGFbaWR4KytdXG4gICAgdWludDhbMV0gPSBkYXRhW2lkeCsrXVxuICAgIHVpbnQ4WzBdID0gZGF0YVtpZHgrK11cblxuICAgIHZhciBjcmNBY3R1YWwgPSBpbnQzMlswXVxuICAgIHZhciBjcmNFeHBlY3QgPSBjcmMzMi5idWYoY2h1bmspXG4gICAgaWYgKGNyY0V4cGVjdCAhPT0gY3JjQWN0dWFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDUkMgdmFsdWVzIGZvciAnICsgbmFtZSArICcgaGVhZGVyIGRvIG5vdCBtYXRjaCwgUE5HIGZpbGUgaXMgbGlrZWx5IGNvcnJ1cHRlZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBUaGUgY2h1bmsgZGF0YSBpcyBub3cgY29waWVkIHRvIHJlbW92ZSB0aGUgNCBwcmVjZWRpbmdcbiAgICAvLyBieXRlcyB1c2VkIGZvciB0aGUgY2h1bmsgbmFtZS90eXBlLlxuICAgIHZhciBjaHVua0RhdGEgPSBuZXcgVWludDhBcnJheShjaHVuay5idWZmZXIuc2xpY2UoNCkpXG5cbiAgICBjaHVua3MucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgZGF0YTogY2h1bmtEYXRhXG4gICAgfSlcbiAgfVxuXG4gIGlmICghZW5kZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJy5wbmcgZmlsZSBlbmRlZCBwcmVtYXR1cmVseTogbm8gSUVORCBoZWFkZXIgd2FzIGZvdW5kJylcbiAgfVxuXG4gIHJldHVybiBjaHVua3Ncbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/png-chunks-extract/index.js\n");
244
+
245
+ /***/ }),
246
+
247
+ /***/ "../../../node_modules/sliced/index.js":
248
+ /*!*********************************************!*\
249
+ !*** ../../../node_modules/sliced/index.js ***!
250
+ \*********************************************/
251
+ /***/ ((module) => {
252
+
253
+ eval("\n/**\n * An Array.prototype.slice.call(arguments) alternative\n *\n * @param {Object} args something with a length\n * @param {Number} slice\n * @param {Number} sliceEnd\n * @api public\n */\n\nmodule.exports = function (args, slice, sliceEnd) {\n var ret = [];\n var len = args.length;\n\n if (0 === len) return ret;\n\n var start = slice < 0\n ? Math.max(0, slice + len)\n : slice || 0;\n\n if (sliceEnd !== undefined) {\n len = sliceEnd < 0\n ? sliceEnd + len\n : sliceEnd\n }\n\n while (len-- > start) {\n ret[len - start] = args[len];\n }\n\n return ret;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NsaWNlZC9pbmRleC5qcy5qcyIsIm1hcHBpbmdzIjoiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NsaWNlZC9pbmRleC5qcz9hMGYwIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBBbiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpIGFsdGVybmF0aXZlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3Mgc29tZXRoaW5nIHdpdGggYSBsZW5ndGhcbiAqIEBwYXJhbSB7TnVtYmVyfSBzbGljZVxuICogQHBhcmFtIHtOdW1iZXJ9IHNsaWNlRW5kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3MsIHNsaWNlLCBzbGljZUVuZCkge1xuICB2YXIgcmV0ID0gW107XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcblxuICBpZiAoMCA9PT0gbGVuKSByZXR1cm4gcmV0O1xuXG4gIHZhciBzdGFydCA9IHNsaWNlIDwgMFxuICAgID8gTWF0aC5tYXgoMCwgc2xpY2UgKyBsZW4pXG4gICAgOiBzbGljZSB8fCAwO1xuXG4gIGlmIChzbGljZUVuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuID0gc2xpY2VFbmQgPCAwXG4gICAgICA/IHNsaWNlRW5kICsgbGVuXG4gICAgICA6IHNsaWNlRW5kXG4gIH1cblxuICB3aGlsZSAobGVuLS0gPiBzdGFydCkge1xuICAgIHJldFtsZW4gLSBzdGFydF0gPSBhcmdzW2xlbl07XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/sliced/index.js\n");
254
+
255
+ /***/ }),
256
+
257
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/directory-open.mjs":
258
+ /*!*****************************************************************************************!*\
259
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/directory-open.mjs ***!
260
+ \*****************************************************************************************/
261
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
262
+
263
+ "use strict";
264
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\nconst e=async(t,r,a=t.name)=>{const i=[],n=[];for await(const s of t.values()){const o=`${a}/${s.name}`;\"file\"===s.kind?n.push(s.getFile().then((e=>(e.directoryHandle=t,Object.defineProperty(e,\"webkitRelativePath\",{configurable:!0,enumerable:!0,get:()=>o}))))):\"directory\"===s.kind&&r&&i.push(e(s,r,o))}return[...(await Promise.all(i)).flat(),...await Promise.all(n)]};\n/**\n * Opens a directory from disk using the File System Access API.\n * @type { typeof import(\"../../index\").directoryOpen }\n *//* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(t={})=>{t.recursive=t.recursive||!1;const r=await window.showDirectoryPicker({id:t.id,startIn:t.startIn});return e(r,t.recursive)});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9mcy1hY2Nlc3MvZGlyZWN0b3J5LW9wZW4ubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixnQkFBZ0IsaUNBQWlDLFdBQVcsRUFBRSxHQUFHLE9BQU8sRUFBRSwrR0FBK0csd0NBQXdDLGdEQUFnRDtBQUMvUztBQUNBO0FBQ0EsV0FBVztBQUNYLEdBQUcsaUVBQWUsVUFBVSxJQUFJLDRCQUE0QiwwQ0FBMEMsMEJBQTBCLEVBQUUsd0JBQXdCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AZHdlbGxlL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZnMtYWNjZXNzL2RpcmVjdG9yeS1vcGVuLm1qcz9hNWZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gQGxpY2Vuc2UgwqkgMjAyMCBHb29nbGUgTExDLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuY29uc3QgZT1hc3luYyh0LHIsYT10Lm5hbWUpPT57Y29uc3QgaT1bXSxuPVtdO2ZvciBhd2FpdChjb25zdCBzIG9mIHQudmFsdWVzKCkpe2NvbnN0IG89YCR7YX0vJHtzLm5hbWV9YDtcImZpbGVcIj09PXMua2luZD9uLnB1c2gocy5nZXRGaWxlKCkudGhlbigoZT0+KGUuZGlyZWN0b3J5SGFuZGxlPXQsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJ3ZWJraXRSZWxhdGl2ZVBhdGhcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OigpPT5vfSkpKSkpOlwiZGlyZWN0b3J5XCI9PT1zLmtpbmQmJnImJmkucHVzaChlKHMscixvKSl9cmV0dXJuWy4uLihhd2FpdCBQcm9taXNlLmFsbChpKSkuZmxhdCgpLC4uLmF3YWl0IFByb21pc2UuYWxsKG4pXX07XG4vKipcbiAqIE9wZW5zIGEgZGlyZWN0b3J5IGZyb20gZGlzayB1c2luZyB0aGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSS5cbiAqIEB0eXBlIHsgdHlwZW9mIGltcG9ydChcIi4uLy4uL2luZGV4XCIpLmRpcmVjdG9yeU9wZW4gfVxuICovZXhwb3J0IGRlZmF1bHQgYXN5bmModD17fSk9Pnt0LnJlY3Vyc2l2ZT10LnJlY3Vyc2l2ZXx8ITE7Y29uc3Qgcj1hd2FpdCB3aW5kb3cuc2hvd0RpcmVjdG9yeVBpY2tlcih7aWQ6dC5pZCxzdGFydEluOnQuc3RhcnRJbn0pO3JldHVybiBlKHIsdC5yZWN1cnNpdmUpfTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/directory-open.mjs\n");
265
+
266
+ /***/ }),
267
+
268
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-open.mjs":
269
+ /*!************************************************************************************!*\
270
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-open.mjs ***!
271
+ \************************************************************************************/
272
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
273
+
274
+ "use strict";
275
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\nconst e=async e=>{const t=await e.getFile();return t.handle=e,t};\n/**\n * Opens a file from disk using the File System Access API.\n * @type { typeof import(\"../../index\").fileOpen }\n *//* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(t=[{}])=>{Array.isArray(t)||(t=[t]);const i=[];t.forEach(((e,t)=>{i[t]={description:e.description||\"\",accept:{}},e.mimeTypes?e.mimeTypes.map((c=>{i[t].accept[c]=e.extensions||[]})):i[t].accept[\"*/*\"]=e.extensions||[]}));const c=await window.showOpenFilePicker({id:t[0].id,startIn:t[0].startIn,types:i,multiple:t[0].multiple||!1,excludeAcceptAllOption:t[0].excludeAcceptAllOption||!1}),a=await Promise.all(c.map(e));return t[0].multiple?a:a[0]});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9mcy1hY2Nlc3MvZmlsZS1vcGVuLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsMEJBQTBCO0FBQzVDO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsR0FBRyxpRUFBZSxXQUFXLEtBQUssMEJBQTBCLFdBQVcsbUJBQW1CLE1BQU0sd0NBQXdDLGtDQUFrQyxnQ0FBZ0MsdUNBQXVDLEdBQUcseUNBQXlDLDBIQUEwSCxnQ0FBZ0MsNEJBQTRCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AZHdlbGxlL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvZnMtYWNjZXNzL2ZpbGUtb3Blbi5tanM/YTgzZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEBsaWNlbnNlIMKpIDIwMjAgR29vZ2xlIExMQy4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbmNvbnN0IGU9YXN5bmMgZT0+e2NvbnN0IHQ9YXdhaXQgZS5nZXRGaWxlKCk7cmV0dXJuIHQuaGFuZGxlPWUsdH07XG4vKipcbiAqIE9wZW5zIGEgZmlsZSBmcm9tIGRpc2sgdXNpbmcgdGhlIEZpbGUgU3lzdGVtIEFjY2VzcyBBUEkuXG4gKiBAdHlwZSB7IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi9pbmRleFwiKS5maWxlT3BlbiB9XG4gKi9leHBvcnQgZGVmYXVsdCBhc3luYyh0PVt7fV0pPT57QXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKTtjb25zdCBpPVtdO3QuZm9yRWFjaCgoKGUsdCk9PntpW3RdPXtkZXNjcmlwdGlvbjplLmRlc2NyaXB0aW9ufHxcIlwiLGFjY2VwdDp7fX0sZS5taW1lVHlwZXM/ZS5taW1lVHlwZXMubWFwKChjPT57aVt0XS5hY2NlcHRbY109ZS5leHRlbnNpb25zfHxbXX0pKTppW3RdLmFjY2VwdFtcIiovKlwiXT1lLmV4dGVuc2lvbnN8fFtdfSkpO2NvbnN0IGM9YXdhaXQgd2luZG93LnNob3dPcGVuRmlsZVBpY2tlcih7aWQ6dFswXS5pZCxzdGFydEluOnRbMF0uc3RhcnRJbix0eXBlczppLG11bHRpcGxlOnRbMF0ubXVsdGlwbGV8fCExLGV4Y2x1ZGVBY2NlcHRBbGxPcHRpb246dFswXS5leGNsdWRlQWNjZXB0QWxsT3B0aW9ufHwhMX0pLGE9YXdhaXQgUHJvbWlzZS5hbGwoYy5tYXAoZSkpO3JldHVybiB0WzBdLm11bHRpcGxlP2E6YVswXX07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-open.mjs\n");
276
+
277
+ /***/ }),
278
+
279
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-save.mjs":
280
+ /*!************************************************************************************!*\
281
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-save.mjs ***!
282
+ \************************************************************************************/
283
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
284
+
285
+ "use strict";
286
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n/**\n * Saves a file to disk using the File System Access API.\n * @type { typeof import(\"../../index\").fileSave }\n */\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(e,t=[{}],i=null,a=!1)=>{Array.isArray(t)||(t=[t]),t[0].fileName=t[0].fileName||\"Untitled\";const c=[];if(t.forEach(((t,i)=>{c[i]={description:t.description||\"\",accept:{}},t.mimeTypes?(0===i&&t.mimeTypes.push(e.type),t.mimeTypes.map((e=>{c[i].accept[e]=t.extensions||[]}))):c[i].accept[e.type]=t.extensions||[]})),i)try{\n// Check if the file still exists.\nawait i.getFile()}catch(e){if(i=null,a)throw e}const s=i||await window.showSaveFilePicker({suggestedName:t[0].fileName,id:t[0].id,startIn:t[0].startIn,types:c,excludeAcceptAllOption:t[0].excludeAcceptAllOption||!1}),l=await s.createWritable();return await l.write(e),await l.close(),s});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9mcy1hY2Nlc3MvZmlsZS1zYXZlLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsaUVBQWUsYUFBYSxpQkFBaUIsa0VBQWtFLFdBQVcsc0JBQXNCLE1BQU0sd0NBQXdDLG1FQUFtRSxnQ0FBZ0MseUNBQXlDO0FBQzFVO0FBQ0Esa0JBQWtCLFNBQVMsb0JBQW9CLDRDQUE0QywySEFBMkgsNkJBQTZCLDBDQUEwQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGR3ZWxsZS9icm93c2VyLWZzLWFjY2Vzcy9kaXN0L2ZzLWFjY2Vzcy9maWxlLXNhdmUubWpzPzJkNzMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBAbGljZW5zZSDCqSAyMDIwIEdvb2dsZSBMTEMuIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4vKipcbiAqIFNhdmVzIGEgZmlsZSB0byBkaXNrIHVzaW5nIHRoZSBGaWxlIFN5c3RlbSBBY2Nlc3MgQVBJLlxuICogQHR5cGUgeyB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vaW5kZXhcIikuZmlsZVNhdmUgfVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyhlLHQ9W3t9XSxpPW51bGwsYT0hMSk9PntBcnJheS5pc0FycmF5KHQpfHwodD1bdF0pLHRbMF0uZmlsZU5hbWU9dFswXS5maWxlTmFtZXx8XCJVbnRpdGxlZFwiO2NvbnN0IGM9W107aWYodC5mb3JFYWNoKCgodCxpKT0+e2NbaV09e2Rlc2NyaXB0aW9uOnQuZGVzY3JpcHRpb258fFwiXCIsYWNjZXB0Ont9fSx0Lm1pbWVUeXBlcz8oMD09PWkmJnQubWltZVR5cGVzLnB1c2goZS50eXBlKSx0Lm1pbWVUeXBlcy5tYXAoKGU9PntjW2ldLmFjY2VwdFtlXT10LmV4dGVuc2lvbnN8fFtdfSkpKTpjW2ldLmFjY2VwdFtlLnR5cGVdPXQuZXh0ZW5zaW9uc3x8W119KSksaSl0cnl7XG4vLyBDaGVjayBpZiB0aGUgZmlsZSBzdGlsbCBleGlzdHMuXG5hd2FpdCBpLmdldEZpbGUoKX1jYXRjaChlKXtpZihpPW51bGwsYSl0aHJvdyBlfWNvbnN0IHM9aXx8YXdhaXQgd2luZG93LnNob3dTYXZlRmlsZVBpY2tlcih7c3VnZ2VzdGVkTmFtZTp0WzBdLmZpbGVOYW1lLGlkOnRbMF0uaWQsc3RhcnRJbjp0WzBdLnN0YXJ0SW4sdHlwZXM6YyxleGNsdWRlQWNjZXB0QWxsT3B0aW9uOnRbMF0uZXhjbHVkZUFjY2VwdEFsbE9wdGlvbnx8ITF9KSxsPWF3YWl0IHMuY3JlYXRlV3JpdGFibGUoKTtyZXR1cm4gYXdhaXQgbC53cml0ZShlKSxhd2FpdCBsLmNsb3NlKCksc307Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/fs-access/file-save.mjs\n");
287
+
288
+ /***/ }),
289
+
290
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/legacy/directory-open.mjs":
291
+ /*!**************************************************************************************!*\
292
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/legacy/directory-open.mjs ***!
293
+ \**************************************************************************************/
294
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
295
+
296
+ "use strict";
297
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n/**\n * Opens a directory from disk using the legacy\n * `<input type=\"file\" webkitdirectory>` method.\n * @type { typeof import(\"../../index\").directoryOpen }\n */\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(e=[{}])=>(Array.isArray(e)||(e=[e]),e[0].recursive=e[0].recursive||!1,new Promise(((t,r)=>{const i=document.createElement(\"input\");\n// ToDo: Remove this workaround once\n// https://github.com/whatwg/html/issues/6376 is specified and supported.\nlet c;i.type=\"file\",i.webkitdirectory=!0;const l=()=>c(r);e[0].legacySetup&&(c=e[0].legacySetup(t,l,i)),i.addEventListener(\"change\",(()=>{\"function\"==typeof c&&c();let r=Array.from(i.files);e[0].recursive||(r=r.filter((e=>2===e.webkitRelativePath.split(\"/\").length))),t(r)})),i.click()}))));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9sZWdhY3kvZGlyZWN0b3J5LW9wZW4ubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLGlFQUFlLFdBQVcsc0ZBQXNGO0FBQ2hIO0FBQ0E7QUFDQSxNQUFNLG1DQUFtQyxpQkFBaUIsZ0ZBQWdGLDBCQUEwQiwwQkFBMEIsbUZBQW1GLGFBQWEsR0FBRyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGR3ZWxsZS9icm93c2VyLWZzLWFjY2Vzcy9kaXN0L2xlZ2FjeS9kaXJlY3Rvcnktb3Blbi5tanM/MTg2NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEBsaWNlbnNlIMKpIDIwMjAgR29vZ2xlIExMQy4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbi8qKlxuICogT3BlbnMgYSBkaXJlY3RvcnkgZnJvbSBkaXNrIHVzaW5nIHRoZSBsZWdhY3lcbiAqIGA8aW5wdXQgdHlwZT1cImZpbGVcIiB3ZWJraXRkaXJlY3Rvcnk+YCBtZXRob2QuXG4gKiBAdHlwZSB7IHR5cGVvZiBpbXBvcnQoXCIuLi8uLi9pbmRleFwiKS5kaXJlY3RvcnlPcGVuIH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMoZT1be31dKT0+KEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksZVswXS5yZWN1cnNpdmU9ZVswXS5yZWN1cnNpdmV8fCExLG5ldyBQcm9taXNlKCgodCxyKT0+e2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuLy8gVG9EbzogUmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCBvbmNlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL2h0bWwvaXNzdWVzLzYzNzYgaXMgc3BlY2lmaWVkIGFuZCBzdXBwb3J0ZWQuXG5sZXQgYztpLnR5cGU9XCJmaWxlXCIsaS53ZWJraXRkaXJlY3Rvcnk9ITA7Y29uc3QgbD0oKT0+YyhyKTtlWzBdLmxlZ2FjeVNldHVwJiYoYz1lWzBdLmxlZ2FjeVNldHVwKHQsbCxpKSksaS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsKCgpPT57XCJmdW5jdGlvblwiPT10eXBlb2YgYyYmYygpO2xldCByPUFycmF5LmZyb20oaS5maWxlcyk7ZVswXS5yZWN1cnNpdmV8fChyPXIuZmlsdGVyKChlPT4yPT09ZS53ZWJraXRSZWxhdGl2ZVBhdGguc3BsaXQoXCIvXCIpLmxlbmd0aCkpKSx0KHIpfSkpLGkuY2xpY2soKX0pKSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/legacy/directory-open.mjs\n");
298
+
299
+ /***/ }),
300
+
301
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-open.mjs":
302
+ /*!*********************************************************************************!*\
303
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-open.mjs ***!
304
+ \*********************************************************************************/
305
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
306
+
307
+ "use strict";
308
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n/**\n * Opens a file from disk using the legacy `<input type=\"file\">` method.\n * @type { typeof import(\"../../index\").fileOpen }\n */\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(e=[{}])=>(Array.isArray(e)||(e=[e]),new Promise(((t,n)=>{const i=document.createElement(\"input\");i.type=\"file\";const l=[...e.map((e=>e.mimeTypes||[])).join(),e.map((e=>e.extensions||[])).join()].join();\n// ToDo: Remove this workaround once\n// https://github.com/whatwg/html/issues/6376 is specified and supported.\nlet c;i.multiple=e[0].multiple||!1,\n// Empty string allows everything.\ni.accept=l||\"\";const a=()=>c(n);e[0].legacySetup&&(c=e[0].legacySetup(t,a,i)),i.addEventListener(\"change\",(()=>{\"function\"==typeof c&&c(),t(i.multiple?Array.from(i.files):i.files[0])})),i.click()}))));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9sZWdhY3kvZmlsZS1vcGVuLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsaUVBQWUsV0FBVyxvREFBb0Qsd0NBQXdDLGNBQWM7QUFDcEk7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGVBQWUsaUJBQWlCLGdGQUFnRix1RUFBdUUsYUFBYSxHQUFHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AZHdlbGxlL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvbGVnYWN5L2ZpbGUtb3Blbi5tanM/MGI3MCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEBsaWNlbnNlIMKpIDIwMjAgR29vZ2xlIExMQy4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbi8qKlxuICogT3BlbnMgYSBmaWxlIGZyb20gZGlzayB1c2luZyB0aGUgbGVnYWN5IGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIG1ldGhvZC5cbiAqIEB0eXBlIHsgdHlwZW9mIGltcG9ydChcIi4uLy4uL2luZGV4XCIpLmZpbGVPcGVuIH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMoZT1be31dKT0+KEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksbmV3IFByb21pc2UoKCh0LG4pPT57Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7aS50eXBlPVwiZmlsZVwiO2NvbnN0IGw9Wy4uLmUubWFwKChlPT5lLm1pbWVUeXBlc3x8W10pKS5qb2luKCksZS5tYXAoKGU9PmUuZXh0ZW5zaW9uc3x8W10pKS5qb2luKCldLmpvaW4oKTtcbi8vIFRvRG86IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy82Mzc2IGlzIHNwZWNpZmllZCBhbmQgc3VwcG9ydGVkLlxubGV0IGM7aS5tdWx0aXBsZT1lWzBdLm11bHRpcGxlfHwhMSxcbi8vIEVtcHR5IHN0cmluZyBhbGxvd3MgZXZlcnl0aGluZy5cbmkuYWNjZXB0PWx8fFwiXCI7Y29uc3QgYT0oKT0+YyhuKTtlWzBdLmxlZ2FjeVNldHVwJiYoYz1lWzBdLmxlZ2FjeVNldHVwKHQsYSxpKSksaS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsKCgpPT57XCJmdW5jdGlvblwiPT10eXBlb2YgYyYmYygpLHQoaS5tdWx0aXBsZT9BcnJheS5mcm9tKGkuZmlsZXMpOmkuZmlsZXNbMF0pfSkpLGkuY2xpY2soKX0pKSk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-open.mjs\n");
309
+
310
+ /***/ }),
311
+
312
+ /***/ "../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-save.mjs":
313
+ /*!*********************************************************************************!*\
314
+ !*** ../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-save.mjs ***!
315
+ \*********************************************************************************/
316
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
317
+
318
+ "use strict";
319
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/**\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// @license © 2020 Google LLC. Licensed under the Apache License, Version 2.0.\n/**\n * Saves a file to disk using the legacy `<a download>` method.\n * @type { typeof import(\"../../index\").fileSave }\n */\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (async(e,t={})=>{Array.isArray(t)&&(t=t[0]);const c=document.createElement(\"a\");\n// ToDo: Remove this workaround once\n// https://github.com/whatwg/html/issues/6376 is specified and supported.\nlet r;c.download=t.fileName||\"Untitled\",c.href=URL.createObjectURL(e);const l=()=>r(reject);return t.legacySetup&&(r=t[0].legacySetup(resolve,l,c)),c.addEventListener(\"click\",(()=>{\"function\"==typeof r&&r(),\n// `setTimeout()` due to\n// https://github.com/LLK/scratch-gui/issues/1783#issuecomment-426286393\nsetTimeout((()=>URL.revokeObjectURL(c.href)),3e4)})),c.click(),null});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0Bkd2VsbGUvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9sZWdhY3kvZmlsZS1zYXZlLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsaUVBQWUsWUFBWSxJQUFJLDJCQUEyQjtBQUMxRDtBQUNBO0FBQ0EsTUFBTSxnRUFBZ0Usc0JBQXNCLHlGQUF5RjtBQUNyTDtBQUNBO0FBQ0Esa0RBQWtELGtCQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGR3ZWxsZS9icm93c2VyLWZzLWFjY2Vzcy9kaXN0L2xlZ2FjeS9maWxlLXNhdmUubWpzPzE2Y2QiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBAbGljZW5zZSDCqSAyMDIwIEdvb2dsZSBMTEMuIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4vKipcbiAqIFNhdmVzIGEgZmlsZSB0byBkaXNrIHVzaW5nIHRoZSBsZWdhY3kgYDxhIGRvd25sb2FkPmAgbWV0aG9kLlxuICogQHR5cGUgeyB0eXBlb2YgaW1wb3J0KFwiLi4vLi4vaW5kZXhcIikuZmlsZVNhdmUgfVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyhlLHQ9e30pPT57QXJyYXkuaXNBcnJheSh0KSYmKHQ9dFswXSk7Y29uc3QgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbi8vIFRvRG86IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3doYXR3Zy9odG1sL2lzc3Vlcy82Mzc2IGlzIHNwZWNpZmllZCBhbmQgc3VwcG9ydGVkLlxubGV0IHI7Yy5kb3dubG9hZD10LmZpbGVOYW1lfHxcIlVudGl0bGVkXCIsYy5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoZSk7Y29uc3QgbD0oKT0+cihyZWplY3QpO3JldHVybiB0LmxlZ2FjeVNldHVwJiYocj10WzBdLmxlZ2FjeVNldHVwKHJlc29sdmUsbCxjKSksYy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwoKCk9PntcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiZyKCksXG4vLyBgc2V0VGltZW91dCgpYCBkdWUgdG9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9MTEsvc2NyYXRjaC1ndWkvaXNzdWVzLzE3ODMjaXNzdWVjb21tZW50LTQyNjI4NjM5M1xuc2V0VGltZW91dCgoKCk9PlVSTC5yZXZva2VPYmplY3RVUkwoYy5ocmVmKSksM2U0KX0pKSxjLmNsaWNrKCksbnVsbH07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/@dwelle/browser-fs-access/dist/legacy/file-save.mjs\n");
320
+
321
+ /***/ }),
322
+
323
+ /***/ "../../../node_modules/browser-image-compression/dist/browser-image-compression.mjs":
324
+ /*!******************************************************************************************!*\
325
+ !*** ../../../node_modules/browser-image-compression/dist/browser-image-compression.mjs ***!
326
+ \******************************************************************************************/
327
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
328
+
329
+ "use strict";
330
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ imageCompression)\n/* harmony export */ });\n/**\n * Browser Image Compression\n * v1.0.16\n * by Donald <donaldcwl@gmail.com>\n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,r){return r.forEach((function(r){Object.keys(r).forEach((function(t){if(\"default\"!==t&&!(t in e)){var a=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:function(){return r[t]}})}}))})),Object.freeze(e)}function ownKeys$1(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function _objectSpread2(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys$1(Object(t),!0).forEach((function(r){_defineProperty(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys$1(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function _defineProperty(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _slicedToArray(e,r){return _arrayWithHoles(e)||_iterableToArrayLimit(e,r)||_unsupportedIterableToArray(e,r)||_nonIterableRest()}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArrayLimit(e,r){var t=null==e?null:\"undefined\"!=typeof Symbol&&e[Symbol.iterator]||e[\"@@iterator\"];if(null!=t){var a,i,s=[],c=!0,l=!1;try{for(t=t.call(e);!(c=(a=t.next()).done)&&(s.push(a.value),!r||s.length!==r);c=!0);}catch(e){l=!0,i=e}finally{try{c||null==t.return||t.return()}finally{if(l)throw i}}return s}}function _unsupportedIterableToArray(e,r){if(e){if(\"string\"==typeof e)return _arrayLikeToArray(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return\"Object\"===t&&e.constructor&&(t=e.constructor.name),\"Map\"===t||\"Set\"===t?Array.from(e):\"Arguments\"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,a=new Array(r);t<r;t++)a[t]=e[t];return a}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}var commonjsGlobal=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:{};function createCommonjsModule(e){var r={exports:{}};return e(r,r.exports),r.exports}var check=function(e){return e&&e.Math==Math&&e},global$1=check(\"object\"==typeof globalThis&&globalThis)||check(\"object\"==typeof window&&window)||check(\"object\"==typeof self&&self)||check(\"object\"==typeof commonjsGlobal&&commonjsGlobal)||function(){return this}()||Function(\"return this\")(),isPure=!1,setGlobal=function(e,r){try{Object.defineProperty(global$1,e,{value:r,configurable:!0,writable:!0})}catch(t){global$1[e]=r}return r},SHARED=\"__core-js_shared__\",store$1=global$1[SHARED]||setGlobal(SHARED,{}),sharedStore=store$1,shared=createCommonjsModule((function(e){(e.exports=function(e,r){return sharedStore[e]||(sharedStore[e]=void 0!==r?r:{})})(\"versions\",[]).push({version:\"3.18.0\",mode:\"global\",copyright:\"© 2021 Denis Pushkarev (zloirock.ru)\"})})),requireObjectCoercible=function(e){if(null==e)throw TypeError(\"Can't call method on \"+e);return e},toObject=function(e){return Object(requireObjectCoercible(e))},hasOwnProperty={}.hasOwnProperty,has$1=Object.hasOwn||function hasOwn(e,r){return hasOwnProperty.call(toObject(e),r)},id=0,postfix=Math.random(),uid=function(e){return\"Symbol(\"+String(void 0===e?\"\":e)+\")_\"+(++id+postfix).toString(36)},isCallable=function(e){return\"function\"==typeof e},aFunction=function(e){return isCallable(e)?e:void 0},getBuiltIn=function(e,r){return arguments.length<2?aFunction(global$1[e]):global$1[e]&&global$1[e][r]},engineUserAgent=getBuiltIn(\"navigator\",\"userAgent\")||\"\",process$3=global$1.process,Deno=global$1.Deno,versions=process$3&&process$3.versions||Deno&&Deno.version,v8=versions&&versions.v8,match,version;v8?(match=v8.split(\".\"),version=match[0]<4?1:match[0]+match[1]):engineUserAgent&&(match=engineUserAgent.match(/Edge\\/(\\d+)/),(!match||match[1]>=74)&&(match=engineUserAgent.match(/Chrome\\/(\\d+)/),match&&(version=match[1])));var engineV8Version=version&&+version,fails=function(e){try{return!!e()}catch(e){return!0}},nativeSymbol=!!Object.getOwnPropertySymbols&&!fails((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&engineV8Version&&engineV8Version<41})),useSymbolAsUid=nativeSymbol&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,WellKnownSymbolsStore=shared(\"wks\"),Symbol$1=global$1.Symbol,createWellKnownSymbol=useSymbolAsUid?Symbol$1:Symbol$1&&Symbol$1.withoutSetter||uid,wellKnownSymbol=function(e){return has$1(WellKnownSymbolsStore,e)&&(nativeSymbol||\"string\"==typeof WellKnownSymbolsStore[e])||(nativeSymbol&&has$1(Symbol$1,e)?WellKnownSymbolsStore[e]=Symbol$1[e]:WellKnownSymbolsStore[e]=createWellKnownSymbol(\"Symbol.\"+e)),WellKnownSymbolsStore[e]},TO_STRING_TAG$4=wellKnownSymbol(\"toStringTag\"),test$1={};test$1[TO_STRING_TAG$4]=\"z\";var toStringTagSupport=\"[object z]\"===String(test$1),descriptors=!fails((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),isObject=function(e){return\"object\"==typeof e?null!==e:isCallable(e)},document$3=global$1.document,EXISTS$1=isObject(document$3)&&isObject(document$3.createElement),documentCreateElement=function(e){return EXISTS$1?document$3.createElement(e):{}},ie8DomDefine=!descriptors&&!fails((function(){return 7!=Object.defineProperty(documentCreateElement(\"div\"),\"a\",{get:function(){return 7}}).a})),anObject=function(e){if(isObject(e))return e;throw TypeError(String(e)+\" is not an object\")},isSymbol=useSymbolAsUid?function(e){return\"symbol\"==typeof e}:function(e){var r=getBuiltIn(\"Symbol\");return isCallable(r)&&Object(e)instanceof r},tryToString=function(e){try{return String(e)}catch(e){return\"Object\"}},aCallable=function(e){if(isCallable(e))return e;throw TypeError(tryToString(e)+\" is not a function\")},getMethod=function(e,r){var t=e[r];return null==t?void 0:aCallable(t)},ordinaryToPrimitive=function(e,r){var t,a;if(\"string\"===r&&isCallable(t=e.toString)&&!isObject(a=t.call(e)))return a;if(isCallable(t=e.valueOf)&&!isObject(a=t.call(e)))return a;if(\"string\"!==r&&isCallable(t=e.toString)&&!isObject(a=t.call(e)))return a;throw TypeError(\"Can't convert object to primitive value\")},TO_PRIMITIVE=wellKnownSymbol(\"toPrimitive\"),toPrimitive=function(e,r){if(!isObject(e)||isSymbol(e))return e;var t,a=getMethod(e,TO_PRIMITIVE);if(a){if(void 0===r&&(r=\"default\"),t=a.call(e,r),!isObject(t)||isSymbol(t))return t;throw TypeError(\"Can't convert object to primitive value\")}return void 0===r&&(r=\"number\"),ordinaryToPrimitive(e,r)},toPropertyKey=function(e){var r=toPrimitive(e,\"string\");return isSymbol(r)?r:String(r)},$defineProperty=Object.defineProperty,f$5=descriptors?$defineProperty:function defineProperty(e,r,t){if(anObject(e),r=toPropertyKey(r),anObject(t),ie8DomDefine)try{return $defineProperty(e,r,t)}catch(e){}if(\"get\"in t||\"set\"in t)throw TypeError(\"Accessors not supported\");return\"value\"in t&&(e[r]=t.value),e},objectDefineProperty={f:f$5},createPropertyDescriptor=function(e,r){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:r}},createNonEnumerableProperty=descriptors?function(e,r,t){return objectDefineProperty.f(e,r,createPropertyDescriptor(1,t))}:function(e,r,t){return e[r]=t,e},functionToString=Function.toString;isCallable(sharedStore.inspectSource)||(sharedStore.inspectSource=function(e){return functionToString.call(e)});var inspectSource=sharedStore.inspectSource,WeakMap$1=global$1.WeakMap,nativeWeakMap=isCallable(WeakMap$1)&&/native code/.test(inspectSource(WeakMap$1)),keys$2=shared(\"keys\"),sharedKey=function(e){return keys$2[e]||(keys$2[e]=uid(e))},hiddenKeys$1={},OBJECT_ALREADY_INITIALIZED=\"Object already initialized\",WeakMap=global$1.WeakMap,set$2,get$1,has,enforce=function(e){return has(e)?get$1(e):set$2(e,{})},getterFor=function(e){return function(r){var t;if(!isObject(r)||(t=get$1(r)).type!==e)throw TypeError(\"Incompatible receiver, \"+e+\" required\");return t}};if(nativeWeakMap||sharedStore.state){var store=sharedStore.state||(sharedStore.state=new WeakMap),wmget=store.get,wmhas=store.has,wmset=store.set;set$2=function(e,r){if(wmhas.call(store,e))throw new TypeError(OBJECT_ALREADY_INITIALIZED);return r.facade=e,wmset.call(store,e,r),r},get$1=function(e){return wmget.call(store,e)||{}},has=function(e){return wmhas.call(store,e)}}else{var STATE=sharedKey(\"state\");hiddenKeys$1[STATE]=!0,set$2=function(e,r){if(has$1(e,STATE))throw new TypeError(OBJECT_ALREADY_INITIALIZED);return r.facade=e,createNonEnumerableProperty(e,STATE,r),r},get$1=function(e){return has$1(e,STATE)?e[STATE]:{}},has=function(e){return has$1(e,STATE)}}var internalState={set:set$2,get:get$1,has:has,enforce:enforce,getterFor:getterFor},FunctionPrototype$1=Function.prototype,getDescriptor=descriptors&&Object.getOwnPropertyDescriptor,EXISTS=has$1(FunctionPrototype$1,\"name\"),PROPER=EXISTS&&\"something\"===function something(){}.name,CONFIGURABLE=EXISTS&&(!descriptors||descriptors&&getDescriptor(FunctionPrototype$1,\"name\").configurable),functionName={EXISTS:EXISTS,PROPER:PROPER,CONFIGURABLE:CONFIGURABLE},redefine=createCommonjsModule((function(e){var r=functionName.CONFIGURABLE,t=internalState.get,a=internalState.enforce,i=String(String).split(\"String\");(e.exports=function(e,t,s,c){var l,u=!!c&&!!c.unsafe,p=!!c&&!!c.enumerable,d=!!c&&!!c.noTargetGet,h=c&&void 0!==c.name?c.name:t;isCallable(s)&&(\"Symbol(\"===String(h).slice(0,7)&&(h=\"[\"+String(h).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),(!has$1(s,\"name\")||r&&s.name!==h)&&createNonEnumerableProperty(s,\"name\",h),(l=a(s)).source||(l.source=i.join(\"string\"==typeof h?h:\"\"))),e!==global$1?(u?!d&&e[t]&&(p=!0):delete e[t],p?e[t]=s:createNonEnumerableProperty(e,t,s)):p?e[t]=s:setGlobal(t,s)})(Function.prototype,\"toString\",(function toString(){return isCallable(this)&&t(this).source||inspectSource(this)}))})),toString$1={}.toString,classofRaw=function(e){return toString$1.call(e).slice(8,-1)},TO_STRING_TAG$3=wellKnownSymbol(\"toStringTag\"),CORRECT_ARGUMENTS=\"Arguments\"==classofRaw(function(){return arguments}()),tryGet=function(e,r){try{return e[r]}catch(e){}},classof=toStringTagSupport?classofRaw:function(e){var r,t,a;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(t=tryGet(r=Object(e),TO_STRING_TAG$3))?t:CORRECT_ARGUMENTS?classofRaw(r):\"Object\"==(a=classofRaw(r))&&isCallable(r.callee)?\"Arguments\":a},objectToString=toStringTagSupport?{}.toString:function toString(){return\"[object \"+classof(this)+\"]\"};toStringTagSupport||redefine(Object.prototype,\"toString\",objectToString,{unsafe:!0});var $propertyIsEnumerable={}.propertyIsEnumerable,getOwnPropertyDescriptor$4=Object.getOwnPropertyDescriptor,NASHORN_BUG=getOwnPropertyDescriptor$4&&!$propertyIsEnumerable.call({1:2},1),f$4=NASHORN_BUG?function propertyIsEnumerable(e){var r=getOwnPropertyDescriptor$4(this,e);return!!r&&r.enumerable}:$propertyIsEnumerable,objectPropertyIsEnumerable={f:f$4},split=\"\".split,indexedObject=fails((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(e){return\"String\"==classofRaw(e)?split.call(e,\"\"):Object(e)}:Object,toIndexedObject=function(e){return indexedObject(requireObjectCoercible(e))},$getOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,f$3=descriptors?$getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,r){if(e=toIndexedObject(e),r=toPropertyKey(r),ie8DomDefine)try{return $getOwnPropertyDescriptor(e,r)}catch(e){}if(has$1(e,r))return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(e,r),e[r])},objectGetOwnPropertyDescriptor={f:f$3},ceil=Math.ceil,floor$7=Math.floor,toInteger=function(e){return isNaN(e=+e)?0:(e>0?floor$7:ceil)(e)},min$6=Math.min,toLength=function(e){return e>0?min$6(toInteger(e),9007199254740991):0},max$2=Math.max,min$5=Math.min,toAbsoluteIndex=function(e,r){var t=toInteger(e);return t<0?max$2(t+r,0):min$5(t,r)},createMethod$5=function(e){return function(r,t,a){var i,s=toIndexedObject(r),c=toLength(s.length),l=toAbsoluteIndex(a,c);if(e&&t!=t){for(;c>l;)if((i=s[l++])!=i)return!0}else for(;c>l;l++)if((e||l in s)&&s[l]===t)return e||l||0;return!e&&-1}},arrayIncludes={includes:createMethod$5(!0),indexOf:createMethod$5(!1)},indexOf=arrayIncludes.indexOf,objectKeysInternal=function(e,r){var t,a=toIndexedObject(e),i=0,s=[];for(t in a)!has$1(hiddenKeys$1,t)&&has$1(a,t)&&s.push(t);for(;r.length>i;)has$1(a,t=r[i++])&&(~indexOf(s,t)||s.push(t));return s},enumBugKeys=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],hiddenKeys=enumBugKeys.concat(\"length\",\"prototype\"),f$2=Object.getOwnPropertyNames||function getOwnPropertyNames(e){return objectKeysInternal(e,hiddenKeys)},objectGetOwnPropertyNames={f:f$2},f$1=Object.getOwnPropertySymbols,objectGetOwnPropertySymbols={f:f$1},ownKeys=getBuiltIn(\"Reflect\",\"ownKeys\")||function ownKeys(e){var r=objectGetOwnPropertyNames.f(anObject(e)),t=objectGetOwnPropertySymbols.f;return t?r.concat(t(e)):r},copyConstructorProperties=function(e,r){for(var t=ownKeys(r),a=objectDefineProperty.f,i=objectGetOwnPropertyDescriptor.f,s=0;s<t.length;s++){var c=t[s];has$1(e,c)||a(e,c,i(r,c))}},replacement=/#|\\.prototype\\./,isForced=function(e,r){var t=data[normalize(e)];return t==POLYFILL||t!=NATIVE&&(isCallable(r)?fails(r):!!r)},normalize=isForced.normalize=function(e){return String(e).replace(replacement,\".\").toLowerCase()},data=isForced.data={},NATIVE=isForced.NATIVE=\"N\",POLYFILL=isForced.POLYFILL=\"P\",isForced_1=isForced,getOwnPropertyDescriptor$3=objectGetOwnPropertyDescriptor.f,_export=function(e,r){var t,a,i,s,c,l=e.target,u=e.global,p=e.stat;if(t=u?global$1:p?global$1[l]||setGlobal(l,{}):(global$1[l]||{}).prototype)for(a in r){if(s=r[a],i=e.noTargetGet?(c=getOwnPropertyDescriptor$3(t,a))&&c.value:t[a],!isForced_1(u?a:l+(p?\".\":\"#\")+a,e.forced)&&void 0!==i){if(typeof s==typeof i)continue;copyConstructorProperties(s,i)}(e.sham||i&&i.sham)&&createNonEnumerableProperty(s,\"sham\",!0),redefine(t,a,s,e)}},nativePromiseConstructor=global$1.Promise,redefineAll=function(e,r,t){for(var a in r)redefine(e,a,r[a],t);return e},aPossiblePrototype=function(e){if(\"object\"==typeof e||isCallable(e))return e;throw TypeError(\"Can't set \"+String(e)+\" as a prototype\")},objectSetPrototypeOf=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var e,r=!1,t={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set).call(t,[]),r=t instanceof Array}catch(e){}return function setPrototypeOf(t,a){return anObject(t),aPossiblePrototype(a),r?e.call(t,a):t.__proto__=a,t}}():void 0),defineProperty$5=objectDefineProperty.f,TO_STRING_TAG$2=wellKnownSymbol(\"toStringTag\"),setToStringTag=function(e,r,t){e&&!has$1(e=t?e:e.prototype,TO_STRING_TAG$2)&&defineProperty$5(e,TO_STRING_TAG$2,{configurable:!0,value:r})},SPECIES$6=wellKnownSymbol(\"species\"),setSpecies=function(e){var r=getBuiltIn(e),t=objectDefineProperty.f;descriptors&&r&&!r[SPECIES$6]&&t(r,SPECIES$6,{configurable:!0,get:function(){return this}})},anInstance=function(e,r,t){if(e instanceof r)return e;throw TypeError(\"Incorrect \"+(t?t+\" \":\"\")+\"invocation\")},iterators={},ITERATOR$8=wellKnownSymbol(\"iterator\"),ArrayPrototype$1=Array.prototype,isArrayIteratorMethod=function(e){return void 0!==e&&(iterators.Array===e||ArrayPrototype$1[ITERATOR$8]===e)},functionBindContext=function(e,r,t){if(aCallable(e),void 0===r)return e;switch(t){case 0:return function(){return e.call(r)};case 1:return function(t){return e.call(r,t)};case 2:return function(t,a){return e.call(r,t,a)};case 3:return function(t,a,i){return e.call(r,t,a,i)}}return function(){return e.apply(r,arguments)}},ITERATOR$7=wellKnownSymbol(\"iterator\"),getIteratorMethod=function(e){if(null!=e)return getMethod(e,ITERATOR$7)||getMethod(e,\"@@iterator\")||iterators[classof(e)]},getIterator=function(e,r){var t=arguments.length<2?getIteratorMethod(e):r;if(aCallable(t))return anObject(t.call(e));throw TypeError(String(e)+\" is not iterable\")},iteratorClose=function(e,r,t){var a,i;anObject(e);try{if(!(a=getMethod(e,\"return\"))){if(\"throw\"===r)throw t;return t}a=a.call(e)}catch(e){i=!0,a=e}if(\"throw\"===r)throw t;if(i)throw a;return anObject(a),t},Result=function(e,r){this.stopped=e,this.result=r},iterate=function(e,r,t){var a,i,s,c,l,u,p,d=t&&t.that,h=!(!t||!t.AS_ENTRIES),y=!(!t||!t.IS_ITERATOR),A=!(!t||!t.INTERRUPTED),g=functionBindContext(r,d,1+h+A),stop=function(e){return a&&iteratorClose(a,\"normal\",e),new Result(!0,e)},callFn=function(e){return h?(anObject(e),A?g(e[0],e[1],stop):g(e[0],e[1])):A?g(e,stop):g(e)};if(y)a=e;else{if(!(i=getIteratorMethod(e)))throw TypeError(String(e)+\" is not iterable\");if(isArrayIteratorMethod(i)){for(s=0,c=toLength(e.length);c>s;s++)if((l=callFn(e[s]))&&l instanceof Result)return l;return new Result(!1)}a=getIterator(e,i)}for(u=a.next;!(p=u.call(a)).done;){try{l=callFn(p.value)}catch(e){iteratorClose(a,\"throw\",e)}if(\"object\"==typeof l&&l&&l instanceof Result)return l}return new Result(!1)},ITERATOR$6=wellKnownSymbol(\"iterator\"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR$6]=function(){return this},Array.from(iteratorWithReturn,(function(){throw 2}))}catch(e){}var checkCorrectnessOfIteration=function(e,r){if(!r&&!SAFE_CLOSING)return!1;var t=!1;try{var a={};a[ITERATOR$6]=function(){return{next:function(){return{done:t=!0}}}},e(a)}catch(e){}return t},empty=[],construct=getBuiltIn(\"Reflect\",\"construct\"),constructorRegExp=/^\\s*(?:class|function)\\b/,exec=constructorRegExp.exec,INCORRECT_TO_STRING=!constructorRegExp.exec((function(){})),isConstructorModern=function(e){if(!isCallable(e))return!1;try{return construct(Object,empty,e),!0}catch(e){return!1}},isConstructorLegacy=function(e){if(!isCallable(e))return!1;switch(classof(e)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}return INCORRECT_TO_STRING||!!exec.call(constructorRegExp,inspectSource(e))},isConstructor=!construct||fails((function(){var e;return isConstructorModern(isConstructorModern.call)||!isConstructorModern(Object)||!isConstructorModern((function(){e=!0}))||e}))?isConstructorLegacy:isConstructorModern,aConstructor=function(e){if(isConstructor(e))return e;throw TypeError(tryToString(e)+\" is not a constructor\")},SPECIES$5=wellKnownSymbol(\"species\"),speciesConstructor=function(e,r){var t,a=anObject(e).constructor;return void 0===a||null==(t=anObject(a)[SPECIES$5])?r:aConstructor(t)},html=getBuiltIn(\"document\",\"documentElement\"),engineIsIos=/(?:ipad|iphone|ipod).*applewebkit/i.test(engineUserAgent),engineIsNode=\"process\"==classofRaw(global$1.process),set$1=global$1.setImmediate,clear=global$1.clearImmediate,process$2=global$1.process,MessageChannel=global$1.MessageChannel,Dispatch=global$1.Dispatch,counter=0,queue={},ONREADYSTATECHANGE=\"onreadystatechange\",location,defer,channel,port;try{location=global$1.location}catch(e){}var run=function(e){if(queue.hasOwnProperty(e)){var r=queue[e];delete queue[e],r()}},runner=function(e){return function(){run(e)}},listener=function(e){run(e.data)},post=function(e){global$1.postMessage(String(e),location.protocol+\"//\"+location.host)};set$1&&clear||(set$1=function setImmediate(e){for(var r=[],t=arguments.length,a=1;t>a;)r.push(arguments[a++]);return queue[++counter]=function(){(isCallable(e)?e:Function(e)).apply(void 0,r)},defer(counter),counter},clear=function clearImmediate(e){delete queue[e]},engineIsNode?defer=function(e){process$2.nextTick(runner(e))}:Dispatch&&Dispatch.now?defer=function(e){Dispatch.now(runner(e))}:MessageChannel&&!engineIsIos?(channel=new MessageChannel,port=channel.port2,channel.port1.onmessage=listener,defer=functionBindContext(port.postMessage,port,1)):global$1.addEventListener&&isCallable(global$1.postMessage)&&!global$1.importScripts&&location&&\"file:\"!==location.protocol&&!fails(post)?(defer=post,global$1.addEventListener(\"message\",listener,!1)):defer=ONREADYSTATECHANGE in documentCreateElement(\"script\")?function(e){html.appendChild(documentCreateElement(\"script\"))[ONREADYSTATECHANGE]=function(){html.removeChild(this),run(e)}}:function(e){setTimeout(runner(e),0)});var task$1={set:set$1,clear:clear},engineIsIosPebble=/ipad|iphone|ipod/i.test(engineUserAgent)&&void 0!==global$1.Pebble,engineIsWebosWebkit=/web0s(?!.*chrome)/i.test(engineUserAgent),getOwnPropertyDescriptor$2=objectGetOwnPropertyDescriptor.f,macrotask=task$1.set,MutationObserver=global$1.MutationObserver||global$1.WebKitMutationObserver,document$2=global$1.document,process$1=global$1.process,Promise$1=global$1.Promise,queueMicrotaskDescriptor=getOwnPropertyDescriptor$2(global$1,\"queueMicrotask\"),queueMicrotask=queueMicrotaskDescriptor&&queueMicrotaskDescriptor.value,flush,head,last,notify$1,toggle,node,promise,then;queueMicrotask||(flush=function(){var e,r;for(engineIsNode&&(e=process$1.domain)&&e.exit();head;){r=head.fn,head=head.next;try{r()}catch(e){throw head?notify$1():last=void 0,e}}last=void 0,e&&e.enter()},engineIsIos||engineIsNode||engineIsWebosWebkit||!MutationObserver||!document$2?!engineIsIosPebble&&Promise$1&&Promise$1.resolve?(promise=Promise$1.resolve(void 0),promise.constructor=Promise$1,then=promise.then,notify$1=function(){then.call(promise,flush)}):notify$1=engineIsNode?function(){process$1.nextTick(flush)}:function(){macrotask.call(global$1,flush)}:(toggle=!0,node=document$2.createTextNode(\"\"),new MutationObserver(flush).observe(node,{characterData:!0}),notify$1=function(){node.data=toggle=!toggle}));var microtask=queueMicrotask||function(e){var r={fn:e,next:void 0};last&&(last.next=r),head||(head=r,notify$1()),last=r},PromiseCapability=function(e){var r,t;this.promise=new e((function(e,a){if(void 0!==r||void 0!==t)throw TypeError(\"Bad Promise constructor\");r=e,t=a})),this.resolve=aCallable(r),this.reject=aCallable(t)},f=function(e){return new PromiseCapability(e)},newPromiseCapability$1={f:f},promiseResolve=function(e,r){if(anObject(e),isObject(r)&&r.constructor===e)return r;var t=newPromiseCapability$1.f(e);return(0,t.resolve)(r),t.promise},hostReportErrors=function(e,r){var t=global$1.console;t&&t.error&&(1===arguments.length?t.error(e):t.error(e,r))},perform=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},engineIsBrowser=\"object\"==typeof window,task=task$1.set,SPECIES$4=wellKnownSymbol(\"species\"),PROMISE=\"Promise\",getInternalState$4=internalState.get,setInternalState$5=internalState.set,getInternalPromiseState=internalState.getterFor(PROMISE),NativePromisePrototype=nativePromiseConstructor&&nativePromiseConstructor.prototype,PromiseConstructor=nativePromiseConstructor,PromiseConstructorPrototype=NativePromisePrototype,TypeError$1=global$1.TypeError,document$1=global$1.document,process=global$1.process,newPromiseCapability=newPromiseCapability$1.f,newGenericPromiseCapability=newPromiseCapability,DISPATCH_EVENT=!!(document$1&&document$1.createEvent&&global$1.dispatchEvent),NATIVE_REJECTION_EVENT=isCallable(global$1.PromiseRejectionEvent),UNHANDLED_REJECTION=\"unhandledrejection\",REJECTION_HANDLED=\"rejectionhandled\",PENDING=0,FULFILLED=1,REJECTED=2,HANDLED=1,UNHANDLED=2,SUBCLASSING=!1,Internal,OwnPromiseCapability,PromiseWrapper,nativeThen,FORCED$6=isForced_1(PROMISE,(function(){var e=inspectSource(PromiseConstructor),r=e!==String(PromiseConstructor);if(!r&&66===engineV8Version)return!0;if(engineV8Version>=51&&/native code/.test(e))return!1;var t=new PromiseConstructor((function(e){e(1)})),FakePromise=function(e){e((function(){}),(function(){}))};return(t.constructor={})[SPECIES$4]=FakePromise,!(SUBCLASSING=t.then((function(){}))instanceof FakePromise)||!r&&engineIsBrowser&&!NATIVE_REJECTION_EVENT})),INCORRECT_ITERATION=FORCED$6||!checkCorrectnessOfIteration((function(e){PromiseConstructor.all(e).catch((function(){}))})),isThenable=function(e){var r;return!(!isObject(e)||!isCallable(r=e.then))&&r},notify=function(e,r){if(!e.notified){e.notified=!0;var t=e.reactions;microtask((function(){for(var a=e.value,i=e.state==FULFILLED,s=0;t.length>s;){var c,l,u,p=t[s++],d=i?p.ok:p.fail,h=p.resolve,y=p.reject,A=p.domain;try{d?(i||(e.rejection===UNHANDLED&&onHandleUnhandled(e),e.rejection=HANDLED),!0===d?c=a:(A&&A.enter(),c=d(a),A&&(A.exit(),u=!0)),c===p.promise?y(TypeError$1(\"Promise-chain cycle\")):(l=isThenable(c))?l.call(c,h,y):h(c)):y(a)}catch(e){A&&!u&&A.exit(),y(e)}}e.reactions=[],e.notified=!1,r&&!e.rejection&&onUnhandled(e)}))}},dispatchEvent=function(e,r,t){var a,i;DISPATCH_EVENT?((a=document$1.createEvent(\"Event\")).promise=r,a.reason=t,a.initEvent(e,!1,!0),global$1.dispatchEvent(a)):a={promise:r,reason:t},!NATIVE_REJECTION_EVENT&&(i=global$1[\"on\"+e])?i(a):e===UNHANDLED_REJECTION&&hostReportErrors(\"Unhandled promise rejection\",t)},onUnhandled=function(e){task.call(global$1,(function(){var r,t=e.facade,a=e.value;if(isUnhandled(e)&&(r=perform((function(){engineIsNode?process.emit(\"unhandledRejection\",a,t):dispatchEvent(UNHANDLED_REJECTION,t,a)})),e.rejection=engineIsNode||isUnhandled(e)?UNHANDLED:HANDLED,r.error))throw r.value}))},isUnhandled=function(e){return e.rejection!==HANDLED&&!e.parent},onHandleUnhandled=function(e){task.call(global$1,(function(){var r=e.facade;engineIsNode?process.emit(\"rejectionHandled\",r):dispatchEvent(REJECTION_HANDLED,r,e.value)}))},bind=function(e,r,t){return function(a){e(r,a,t)}},internalReject=function(e,r,t){e.done||(e.done=!0,t&&(e=t),e.value=r,e.state=REJECTED,notify(e,!0))},internalResolve=function(e,r,t){if(!e.done){e.done=!0,t&&(e=t);try{if(e.facade===r)throw TypeError$1(\"Promise can't be resolved itself\");var a=isThenable(r);a?microtask((function(){var t={done:!1};try{a.call(r,bind(internalResolve,t,e),bind(internalReject,t,e))}catch(r){internalReject(t,r,e)}})):(e.value=r,e.state=FULFILLED,notify(e,!1))}catch(r){internalReject({done:!1},r,e)}}};if(FORCED$6&&(PromiseConstructor=function Promise(e){anInstance(this,PromiseConstructor,PROMISE),aCallable(e),Internal.call(this);var r=getInternalState$4(this);try{e(bind(internalResolve,r),bind(internalReject,r))}catch(e){internalReject(r,e)}},PromiseConstructorPrototype=PromiseConstructor.prototype,Internal=function Promise(e){setInternalState$5(this,{type:PROMISE,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:PENDING,value:void 0})},Internal.prototype=redefineAll(PromiseConstructorPrototype,{then:function then(e,r){var t=getInternalPromiseState(this),a=newPromiseCapability(speciesConstructor(this,PromiseConstructor));return a.ok=!isCallable(e)||e,a.fail=isCallable(r)&&r,a.domain=engineIsNode?process.domain:void 0,t.parent=!0,t.reactions.push(a),t.state!=PENDING&&notify(t,!1),a.promise},catch:function(e){return this.then(void 0,e)}}),OwnPromiseCapability=function(){var e=new Internal,r=getInternalState$4(e);this.promise=e,this.resolve=bind(internalResolve,r),this.reject=bind(internalReject,r)},newPromiseCapability$1.f=newPromiseCapability=function(e){return e===PromiseConstructor||e===PromiseWrapper?new OwnPromiseCapability(e):newGenericPromiseCapability(e)},isCallable(nativePromiseConstructor)&&NativePromisePrototype!==Object.prototype)){nativeThen=NativePromisePrototype.then,SUBCLASSING||(redefine(NativePromisePrototype,\"then\",(function then(e,r){var t=this;return new PromiseConstructor((function(e,r){nativeThen.call(t,e,r)})).then(e,r)}),{unsafe:!0}),redefine(NativePromisePrototype,\"catch\",PromiseConstructorPrototype.catch,{unsafe:!0}));try{delete NativePromisePrototype.constructor}catch(e){}objectSetPrototypeOf&&objectSetPrototypeOf(NativePromisePrototype,PromiseConstructorPrototype)}_export({global:!0,wrap:!0,forced:FORCED$6},{Promise:PromiseConstructor}),setToStringTag(PromiseConstructor,PROMISE,!1),setSpecies(PROMISE),PromiseWrapper=getBuiltIn(PROMISE),_export({target:PROMISE,stat:!0,forced:FORCED$6},{reject:function reject(e){var r=newPromiseCapability(this);return r.reject.call(void 0,e),r.promise}}),_export({target:PROMISE,stat:!0,forced:FORCED$6},{resolve:function resolve(e){return promiseResolve(this,e)}}),_export({target:PROMISE,stat:!0,forced:INCORRECT_ITERATION},{all:function all(e){var r=this,t=newPromiseCapability(r),a=t.resolve,i=t.reject,s=perform((function(){var t=aCallable(r.resolve),s=[],c=0,l=1;iterate(e,(function(e){var u=c++,p=!1;s.push(void 0),l++,t.call(r,e).then((function(e){p||(p=!0,s[u]=e,--l||a(s))}),i)})),--l||a(s)}));return s.error&&i(s.value),t.promise},race:function race(e){var r=this,t=newPromiseCapability(r),a=t.reject,i=perform((function(){var i=aCallable(r.resolve);iterate(e,(function(e){i.call(r,e).then(t.resolve,a)}))}));return i.error&&a(i.value),t.promise}});var inheritIfRequired=function(e,r,t){var a,i;return objectSetPrototypeOf&&isCallable(a=r.constructor)&&a!==t&&isObject(i=a.prototype)&&i!==t.prototype&&objectSetPrototypeOf(e,i),e},objectKeys=Object.keys||function keys(e){return objectKeysInternal(e,enumBugKeys)},objectDefineProperties=descriptors?Object.defineProperties:function defineProperties(e,r){anObject(e);for(var t,a=objectKeys(r),i=a.length,s=0;i>s;)objectDefineProperty.f(e,t=a[s++],r[t]);return e},GT=\">\",LT=\"<\",PROTOTYPE$1=\"prototype\",SCRIPT=\"script\",IE_PROTO$1=sharedKey(\"IE_PROTO\"),EmptyConstructor=function(){},scriptTag=function(e){return LT+SCRIPT+GT+e+LT+\"/\"+SCRIPT+GT},NullProtoObjectViaActiveX=function(e){e.write(scriptTag(\"\")),e.close();var r=e.parentWindow.Object;return e=null,r},NullProtoObjectViaIFrame=function(){var e,r=documentCreateElement(\"iframe\"),t=\"java\"+SCRIPT+\":\";return r.style.display=\"none\",html.appendChild(r),r.src=String(t),(e=r.contentWindow.document).open(),e.write(scriptTag(\"document.F=Object\")),e.close(),e.F},activeXDocument,NullProtoObject=function(){try{activeXDocument=new ActiveXObject(\"htmlfile\")}catch(e){}NullProtoObject=\"undefined\"!=typeof document?document.domain&&activeXDocument?NullProtoObjectViaActiveX(activeXDocument):NullProtoObjectViaIFrame():NullProtoObjectViaActiveX(activeXDocument);for(var e=enumBugKeys.length;e--;)delete NullProtoObject[PROTOTYPE$1][enumBugKeys[e]];return NullProtoObject()};hiddenKeys$1[IE_PROTO$1]=!0;var objectCreate=Object.create||function create(e,r){var t;return null!==e?(EmptyConstructor[PROTOTYPE$1]=anObject(e),t=new EmptyConstructor,EmptyConstructor[PROTOTYPE$1]=null,t[IE_PROTO$1]=e):t=NullProtoObject(),void 0===r?t:objectDefineProperties(t,r)},toString=function(e){if(\"Symbol\"===classof(e))throw TypeError(\"Cannot convert a Symbol value to a string\");return String(e)},whitespaces=\"\\t\\n\\v\\f\\r                 \\u2028\\u2029\\ufeff\",whitespace=\"[\"+whitespaces+\"]\",ltrim=RegExp(\"^\"+whitespace+whitespace+\"*\"),rtrim=RegExp(whitespace+whitespace+\"*$\"),createMethod$4=function(e){return function(r){var t=toString(requireObjectCoercible(r));return 1&e&&(t=t.replace(ltrim,\"\")),2&e&&(t=t.replace(rtrim,\"\")),t}},stringTrim={start:createMethod$4(1),end:createMethod$4(2),trim:createMethod$4(3)},getOwnPropertyNames$1=objectGetOwnPropertyNames.f,getOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,defineProperty$4=objectDefineProperty.f,trim=stringTrim.trim,NUMBER=\"Number\",NativeNumber=global$1[NUMBER],NumberPrototype=NativeNumber.prototype,BROKEN_CLASSOF=classofRaw(objectCreate(NumberPrototype))==NUMBER,toNumber=function(e){if(isSymbol(e))throw TypeError(\"Cannot convert a Symbol value to a number\");var r,t,a,i,s,c,l,u,p=toPrimitive(e,\"number\");if(\"string\"==typeof p&&p.length>2)if(43===(r=(p=trim(p)).charCodeAt(0))||45===r){if(88===(t=p.charCodeAt(2))||120===t)return NaN}else if(48===r){switch(p.charCodeAt(1)){case 66:case 98:a=2,i=49;break;case 79:case 111:a=8,i=55;break;default:return+p}for(c=(s=p.slice(2)).length,l=0;l<c;l++)if((u=s.charCodeAt(l))<48||u>i)return NaN;return parseInt(s,a)}return+p};if(isForced_1(NUMBER,!NativeNumber(\" 0o1\")||!NativeNumber(\"0b1\")||NativeNumber(\"+0x1\"))){for(var NumberWrapper=function Number(e){var r=arguments.length<1?0:e,t=this;return t instanceof NumberWrapper&&(BROKEN_CLASSOF?fails((function(){NumberPrototype.valueOf.call(t)})):classofRaw(t)!=NUMBER)?inheritIfRequired(new NativeNumber(toNumber(r)),t,NumberWrapper):toNumber(r)},keys$1=descriptors?getOwnPropertyNames$1(NativeNumber):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range\".split(\",\"),j$1=0,key$1;keys$1.length>j$1;j$1++)has$1(NativeNumber,key$1=keys$1[j$1])&&!has$1(NumberWrapper,key$1)&&defineProperty$4(NumberWrapper,key$1,getOwnPropertyDescriptor$1(NativeNumber,key$1));NumberWrapper.prototype=NumberPrototype,NumberPrototype.constructor=NumberWrapper,redefine(global$1,NUMBER,NumberWrapper)}var FUNCTION_NAME_EXISTS=functionName.EXISTS,defineProperty$3=objectDefineProperty.f,FunctionPrototype=Function.prototype,FunctionPrototypeToString=FunctionPrototype.toString,nameRE=/^\\s*function ([^ (]*)/,NAME$1=\"name\";descriptors&&!FUNCTION_NAME_EXISTS&&defineProperty$3(FunctionPrototype,NAME$1,{configurable:!0,get:function(){try{return FunctionPrototypeToString.call(this).match(nameRE)[1]}catch(e){return\"\"}}}),_export({global:!0},{globalThis:global$1});var $assign=Object.assign,defineProperty$2=Object.defineProperty,objectAssign=!$assign||fails((function(){if(descriptors&&1!==$assign({b:1},$assign(defineProperty$2({},\"a\",{enumerable:!0,get:function(){defineProperty$2(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},r={},t=Symbol();return e[t]=7,\"abcdefghijklmnopqrst\".split(\"\").forEach((function(e){r[e]=e})),7!=$assign({},e)[t]||\"abcdefghijklmnopqrst\"!=objectKeys($assign({},r)).join(\"\")}))?function assign(e,r){for(var t=toObject(e),a=arguments.length,i=1,s=objectGetOwnPropertySymbols.f,c=objectPropertyIsEnumerable.f;a>i;)for(var l,u=indexedObject(arguments[i++]),p=s?objectKeys(u).concat(s(u)):objectKeys(u),d=p.length,h=0;d>h;)l=p[h++],descriptors&&!c.call(u,l)||(t[l]=u[l]);return t}:$assign;_export({target:\"Object\",stat:!0,forced:Object.assign!==objectAssign},{assign:objectAssign});var path=global$1;path.Object.assign;var regexpFlags=function(){var e=anObject(this),r=\"\";return e.global&&(r+=\"g\"),e.ignoreCase&&(r+=\"i\"),e.multiline&&(r+=\"m\"),e.dotAll&&(r+=\"s\"),e.unicode&&(r+=\"u\"),e.sticky&&(r+=\"y\"),r},$RegExp$2=global$1.RegExp,UNSUPPORTED_Y$2=fails((function(){var e=$RegExp$2(\"a\",\"y\");return e.lastIndex=2,null!=e.exec(\"abcd\")})),BROKEN_CARET=fails((function(){var e=$RegExp$2(\"^r\",\"gy\");return e.lastIndex=2,null!=e.exec(\"str\")})),regexpStickyHelpers={UNSUPPORTED_Y:UNSUPPORTED_Y$2,BROKEN_CARET:BROKEN_CARET},$RegExp$1=global$1.RegExp,regexpUnsupportedDotAll=fails((function(){var e=$RegExp$1(\".\",\"s\");return!(e.dotAll&&e.exec(\"\\n\")&&\"s\"===e.flags)})),$RegExp=global$1.RegExp,regexpUnsupportedNcg=fails((function(){var e=$RegExp(\"(?<a>b)\",\"g\");return\"b\"!==e.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(e,\"$<a>c\")})),getInternalState$3=internalState.get,nativeExec=RegExp.prototype.exec,nativeReplace=shared(\"native-string-replace\",String.prototype.replace),patchedExec=nativeExec,UPDATES_LAST_INDEX_WRONG=(re1=/a/,re2=/b*/g,nativeExec.call(re1,\"a\"),nativeExec.call(re2,\"a\"),0!==re1.lastIndex||0!==re2.lastIndex),re1,re2,UNSUPPORTED_Y$1=regexpStickyHelpers.UNSUPPORTED_Y||regexpStickyHelpers.BROKEN_CARET,NPCG_INCLUDED=void 0!==/()??/.exec(\"\")[1],PATCH=UPDATES_LAST_INDEX_WRONG||NPCG_INCLUDED||UNSUPPORTED_Y$1||regexpUnsupportedDotAll||regexpUnsupportedNcg;PATCH&&(patchedExec=function exec(e){var r,t,a,i,s,c,l,u=this,p=getInternalState$3(u),d=toString(e),h=p.raw;if(h)return h.lastIndex=u.lastIndex,r=patchedExec.call(h,d),u.lastIndex=h.lastIndex,r;var y=p.groups,A=UNSUPPORTED_Y$1&&u.sticky,g=regexpFlags.call(u),v=u.source,E=0,m=d;if(A&&(-1===(g=g.replace(\"y\",\"\")).indexOf(\"g\")&&(g+=\"g\"),m=d.slice(u.lastIndex),u.lastIndex>0&&(!u.multiline||u.multiline&&\"\\n\"!==d.charAt(u.lastIndex-1))&&(v=\"(?: \"+v+\")\",m=\" \"+m,E++),t=new RegExp(\"^(?:\"+v+\")\",g)),NPCG_INCLUDED&&(t=new RegExp(\"^\"+v+\"$(?!\\\\s)\",g)),UPDATES_LAST_INDEX_WRONG&&(a=u.lastIndex),i=nativeExec.call(A?t:u,m),A?i?(i.input=i.input.slice(E),i[0]=i[0].slice(E),i.index=u.lastIndex,u.lastIndex+=i[0].length):u.lastIndex=0:UPDATES_LAST_INDEX_WRONG&&i&&(u.lastIndex=u.global?i.index+i[0].length:a),NPCG_INCLUDED&&i&&i.length>1&&nativeReplace.call(i[0],t,(function(){for(s=1;s<arguments.length-2;s++)void 0===arguments[s]&&(i[s]=void 0)})),i&&y)for(i.groups=c=objectCreate(null),s=0;s<y.length;s++)c[(l=y[s])[0]]=i[l[1]];return i});var regexpExec=patchedExec;_export({target:\"RegExp\",proto:!0,forced:/./.exec!==regexpExec},{exec:regexpExec});var SPECIES$3=wellKnownSymbol(\"species\"),RegExpPrototype$1=RegExp.prototype,fixRegexpWellKnownSymbolLogic=function(e,r,t,a){var i=wellKnownSymbol(e),s=!fails((function(){var r={};return r[i]=function(){return 7},7!=\"\"[e](r)})),c=s&&!fails((function(){var r=!1,t=/a/;return\"split\"===e&&((t={}).constructor={},t.constructor[SPECIES$3]=function(){return t},t.flags=\"\",t[i]=/./[i]),t.exec=function(){return r=!0,null},t[i](\"\"),!r}));if(!s||!c||t){var l=/./[i],u=r(i,\"\"[e],(function(e,r,t,a,i){var c=r.exec;return c===regexpExec||c===RegExpPrototype$1.exec?s&&!i?{done:!0,value:l.call(r,t,a)}:{done:!0,value:e.call(t,r,a)}:{done:!1}}));redefine(String.prototype,e,u[0]),redefine(RegExpPrototype$1,i,u[1])}a&&createNonEnumerableProperty(RegExpPrototype$1[i],\"sham\",!0)},MATCH$1=wellKnownSymbol(\"match\"),isRegexp=function(e){var r;return isObject(e)&&(void 0!==(r=e[MATCH$1])?!!r:\"RegExp\"==classofRaw(e))},createMethod$3=function(e){return function(r,t){var a,i,s=toString(requireObjectCoercible(r)),c=toInteger(t),l=s.length;return c<0||c>=l?e?\"\":void 0:(a=s.charCodeAt(c))<55296||a>56319||c+1===l||(i=s.charCodeAt(c+1))<56320||i>57343?e?s.charAt(c):a:e?s.slice(c,c+2):i-56320+(a-55296<<10)+65536}},stringMultibyte={codeAt:createMethod$3(!1),charAt:createMethod$3(!0)},charAt$1=stringMultibyte.charAt,advanceStringIndex=function(e,r,t){return r+(t?charAt$1(e,r).length:1)},regexpExecAbstract=function(e,r){var t=e.exec;if(isCallable(t)){var a=t.call(e,r);return null!==a&&anObject(a),a}if(\"RegExp\"===classofRaw(e))return regexpExec.call(e,r);throw TypeError(\"RegExp#exec called on incompatible receiver\")},UNSUPPORTED_Y=regexpStickyHelpers.UNSUPPORTED_Y,arrayPush=[].push,min$4=Math.min,MAX_UINT32=4294967295,SPLIT_WORKS_WITH_OVERWRITTEN_EXEC=!fails((function(){var e=/(?:)/,r=e.exec;e.exec=function(){return r.apply(this,arguments)};var t=\"ab\".split(e);return 2!==t.length||\"a\"!==t[0]||\"b\"!==t[1]}));fixRegexpWellKnownSymbolLogic(\"split\",(function(e,r,t){var a;return a=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(e,t){var a=toString(requireObjectCoercible(this)),i=void 0===t?MAX_UINT32:t>>>0;if(0===i)return[];if(void 0===e)return[a];if(!isRegexp(e))return r.call(a,e,i);for(var s,c,l,u=[],p=(e.ignoreCase?\"i\":\"\")+(e.multiline?\"m\":\"\")+(e.unicode?\"u\":\"\")+(e.sticky?\"y\":\"\"),d=0,h=new RegExp(e.source,p+\"g\");(s=regexpExec.call(h,a))&&!((c=h.lastIndex)>d&&(u.push(a.slice(d,s.index)),s.length>1&&s.index<a.length&&arrayPush.apply(u,s.slice(1)),l=s[0].length,d=c,u.length>=i));)h.lastIndex===s.index&&h.lastIndex++;return d===a.length?!l&&h.test(\"\")||u.push(\"\"):u.push(a.slice(d)),u.length>i?u.slice(0,i):u}:\"0\".split(void 0,0).length?function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)}:r,[function split(r,t){var i=requireObjectCoercible(this),s=null==r?void 0:getMethod(r,e);return s?s.call(r,i,t):a.call(toString(i),r,t)},function(e,i){var s=anObject(this),c=toString(e),l=t(a,s,c,i,a!==r);if(l.done)return l.value;var u=speciesConstructor(s,RegExp),p=s.unicode,d=(s.ignoreCase?\"i\":\"\")+(s.multiline?\"m\":\"\")+(s.unicode?\"u\":\"\")+(UNSUPPORTED_Y?\"g\":\"y\"),h=new u(UNSUPPORTED_Y?\"^(?:\"+s.source+\")\":s,d),y=void 0===i?MAX_UINT32:i>>>0;if(0===y)return[];if(0===c.length)return null===regexpExecAbstract(h,c)?[c]:[];for(var A=0,g=0,v=[];g<c.length;){h.lastIndex=UNSUPPORTED_Y?0:g;var E,m=regexpExecAbstract(h,UNSUPPORTED_Y?c.slice(g):c);if(null===m||(E=min$4(toLength(h.lastIndex+(UNSUPPORTED_Y?g:0)),c.length))===A)g=advanceStringIndex(c,g,p);else{if(v.push(c.slice(A,g)),v.length===y)return v;for(var I=1;I<=m.length-1;I++)if(v.push(m[I]),v.length===y)return v;g=A=E}}return v.push(c.slice(A)),v}]}),!SPLIT_WORKS_WITH_OVERWRITTEN_EXEC,UNSUPPORTED_Y),fixRegexpWellKnownSymbolLogic(\"match\",(function(e,r,t){return[function match(r){var t=requireObjectCoercible(this),a=null==r?void 0:getMethod(r,e);return a?a.call(r,t):new RegExp(r)[e](toString(t))},function(e){var a=anObject(this),i=toString(e),s=t(r,a,i);if(s.done)return s.value;if(!a.global)return regexpExecAbstract(a,i);var c=a.unicode;a.lastIndex=0;for(var l,u=[],p=0;null!==(l=regexpExecAbstract(a,i));){var d=toString(l[0]);u[p]=d,\"\"===d&&(a.lastIndex=advanceStringIndex(i,toLength(a.lastIndex),c)),p++}return 0===p?null:u}]}));var UNSCOPABLES=wellKnownSymbol(\"unscopables\"),ArrayPrototype=Array.prototype;null==ArrayPrototype[UNSCOPABLES]&&objectDefineProperty.f(ArrayPrototype,UNSCOPABLES,{configurable:!0,value:objectCreate(null)});var addToUnscopables=function(e){ArrayPrototype[UNSCOPABLES][e]=!0},correctPrototypeGetter=!fails((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype})),IE_PROTO=sharedKey(\"IE_PROTO\"),ObjectPrototype$2=Object.prototype,objectGetPrototypeOf=correctPrototypeGetter?Object.getPrototypeOf:function(e){var r=toObject(e);if(has$1(r,IE_PROTO))return r[IE_PROTO];var t=r.constructor;return isCallable(t)&&r instanceof t?t.prototype:r instanceof Object?ObjectPrototype$2:null},ITERATOR$5=wellKnownSymbol(\"iterator\"),BUGGY_SAFARI_ITERATORS$1=!1,IteratorPrototype$2,PrototypeOfArrayIteratorPrototype,arrayIterator;[].keys&&(arrayIterator=[].keys(),\"next\"in arrayIterator?(PrototypeOfArrayIteratorPrototype=objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)),PrototypeOfArrayIteratorPrototype!==Object.prototype&&(IteratorPrototype$2=PrototypeOfArrayIteratorPrototype)):BUGGY_SAFARI_ITERATORS$1=!0);var NEW_ITERATOR_PROTOTYPE=null==IteratorPrototype$2||fails((function(){var e={};return IteratorPrototype$2[ITERATOR$5].call(e)!==e}));NEW_ITERATOR_PROTOTYPE&&(IteratorPrototype$2={}),isCallable(IteratorPrototype$2[ITERATOR$5])||redefine(IteratorPrototype$2,ITERATOR$5,(function(){return this}));var iteratorsCore={IteratorPrototype:IteratorPrototype$2,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS$1},IteratorPrototype$1=iteratorsCore.IteratorPrototype,returnThis$1=function(){return this},createIteratorConstructor=function(e,r,t){var a=r+\" Iterator\";return e.prototype=objectCreate(IteratorPrototype$1,{next:createPropertyDescriptor(1,t)}),setToStringTag(e,a,!1),iterators[a]=returnThis$1,e},PROPER_FUNCTION_NAME$3=functionName.PROPER,CONFIGURABLE_FUNCTION_NAME$1=functionName.CONFIGURABLE,IteratorPrototype=iteratorsCore.IteratorPrototype,BUGGY_SAFARI_ITERATORS=iteratorsCore.BUGGY_SAFARI_ITERATORS,ITERATOR$4=wellKnownSymbol(\"iterator\"),KEYS=\"keys\",VALUES=\"values\",ENTRIES=\"entries\",returnThis=function(){return this},defineIterator=function(e,r,t,a,i,s,c){createIteratorConstructor(t,r,a);var l,u,p,getIterationMethod=function(e){if(e===i&&g)return g;if(!BUGGY_SAFARI_ITERATORS&&e in y)return y[e];switch(e){case KEYS:return function keys(){return new t(this,e)};case VALUES:return function values(){return new t(this,e)};case ENTRIES:return function entries(){return new t(this,e)}}return function(){return new t(this)}},d=r+\" Iterator\",h=!1,y=e.prototype,A=y[ITERATOR$4]||y[\"@@iterator\"]||i&&y[i],g=!BUGGY_SAFARI_ITERATORS&&A||getIterationMethod(i),v=\"Array\"==r&&y.entries||A;if(v&&(l=objectGetPrototypeOf(v.call(new e)))!==Object.prototype&&l.next&&(objectGetPrototypeOf(l)!==IteratorPrototype&&(objectSetPrototypeOf?objectSetPrototypeOf(l,IteratorPrototype):isCallable(l[ITERATOR$4])||redefine(l,ITERATOR$4,returnThis)),setToStringTag(l,d,!0)),PROPER_FUNCTION_NAME$3&&i==VALUES&&A&&A.name!==VALUES&&(CONFIGURABLE_FUNCTION_NAME$1?createNonEnumerableProperty(y,\"name\",VALUES):(h=!0,g=function values(){return A.call(this)})),i)if(u={values:getIterationMethod(VALUES),keys:s?g:getIterationMethod(KEYS),entries:getIterationMethod(ENTRIES)},c)for(p in u)(BUGGY_SAFARI_ITERATORS||h||!(p in y))&&redefine(y,p,u[p]);else _export({target:r,proto:!0,forced:BUGGY_SAFARI_ITERATORS||h},u);return y[ITERATOR$4]!==g&&redefine(y,ITERATOR$4,g,{name:i}),iterators[r]=g,u},ARRAY_ITERATOR=\"Array Iterator\",setInternalState$4=internalState.set,getInternalState$2=internalState.getterFor(ARRAY_ITERATOR),es_array_iterator=defineIterator(Array,\"Array\",(function(e,r){setInternalState$4(this,{type:ARRAY_ITERATOR,target:toIndexedObject(e),index:0,kind:r})}),(function(){var e=getInternalState$2(this),r=e.target,t=e.kind,a=e.index++;return!r||a>=r.length?(e.target=void 0,{value:void 0,done:!0}):\"keys\"==t?{value:a,done:!1}:\"values\"==t?{value:r[a],done:!1}:{value:[a,r[a]],done:!1}}),\"values\");iterators.Arguments=iterators.Array,addToUnscopables(\"keys\"),addToUnscopables(\"values\"),addToUnscopables(\"entries\");var arrayBufferNative=\"undefined\"!=typeof ArrayBuffer&&\"undefined\"!=typeof DataView,defineProperty$1=objectDefineProperty.f,Int8Array$3=global$1.Int8Array,Int8ArrayPrototype=Int8Array$3&&Int8Array$3.prototype,Uint8ClampedArray=global$1.Uint8ClampedArray,Uint8ClampedArrayPrototype=Uint8ClampedArray&&Uint8ClampedArray.prototype,TypedArray=Int8Array$3&&objectGetPrototypeOf(Int8Array$3),TypedArrayPrototype=Int8ArrayPrototype&&objectGetPrototypeOf(Int8ArrayPrototype),ObjectPrototype$1=Object.prototype,isPrototypeOf=ObjectPrototype$1.isPrototypeOf,TO_STRING_TAG$1=wellKnownSymbol(\"toStringTag\"),TYPED_ARRAY_TAG=uid(\"TYPED_ARRAY_TAG\"),TYPED_ARRAY_CONSTRUCTOR$1=uid(\"TYPED_ARRAY_CONSTRUCTOR\"),NATIVE_ARRAY_BUFFER_VIEWS$1=arrayBufferNative&&!!objectSetPrototypeOf&&\"Opera\"!==classof(global$1.opera),TYPED_ARRAY_TAG_REQIRED=!1,NAME,Constructor,Prototype,TypedArrayConstructorsList={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},BigIntArrayConstructorsList={BigInt64Array:8,BigUint64Array:8},isView=function isView(e){if(!isObject(e))return!1;var r=classof(e);return\"DataView\"===r||has$1(TypedArrayConstructorsList,r)||has$1(BigIntArrayConstructorsList,r)},isTypedArray=function(e){if(!isObject(e))return!1;var r=classof(e);return has$1(TypedArrayConstructorsList,r)||has$1(BigIntArrayConstructorsList,r)},aTypedArray$m=function(e){if(isTypedArray(e))return e;throw TypeError(\"Target is not a typed array\")},aTypedArrayConstructor$2=function(e){if(isCallable(e)&&(!objectSetPrototypeOf||isPrototypeOf.call(TypedArray,e)))return e;throw TypeError(tryToString(e)+\" is not a typed array constructor\")},exportTypedArrayMethod$n=function(e,r,t){if(descriptors){if(t)for(var a in TypedArrayConstructorsList){var i=global$1[a];if(i&&has$1(i.prototype,e))try{delete i.prototype[e]}catch(e){}}TypedArrayPrototype[e]&&!t||redefine(TypedArrayPrototype,e,t?r:NATIVE_ARRAY_BUFFER_VIEWS$1&&Int8ArrayPrototype[e]||r)}},exportTypedArrayStaticMethod=function(e,r,t){var a,i;if(descriptors){if(objectSetPrototypeOf){if(t)for(a in TypedArrayConstructorsList)if((i=global$1[a])&&has$1(i,e))try{delete i[e]}catch(e){}if(TypedArray[e]&&!t)return;try{return redefine(TypedArray,e,t?r:NATIVE_ARRAY_BUFFER_VIEWS$1&&TypedArray[e]||r)}catch(e){}}for(a in TypedArrayConstructorsList)!(i=global$1[a])||i[e]&&!t||redefine(i,e,r)}};for(NAME in TypedArrayConstructorsList)Constructor=global$1[NAME],Prototype=Constructor&&Constructor.prototype,Prototype?createNonEnumerableProperty(Prototype,TYPED_ARRAY_CONSTRUCTOR$1,Constructor):NATIVE_ARRAY_BUFFER_VIEWS$1=!1;for(NAME in BigIntArrayConstructorsList)Constructor=global$1[NAME],Prototype=Constructor&&Constructor.prototype,Prototype&&createNonEnumerableProperty(Prototype,TYPED_ARRAY_CONSTRUCTOR$1,Constructor);if((!NATIVE_ARRAY_BUFFER_VIEWS$1||!isCallable(TypedArray)||TypedArray===Function.prototype)&&(TypedArray=function TypedArray(){throw TypeError(\"Incorrect invocation\")},NATIVE_ARRAY_BUFFER_VIEWS$1))for(NAME in TypedArrayConstructorsList)global$1[NAME]&&objectSetPrototypeOf(global$1[NAME],TypedArray);if((!NATIVE_ARRAY_BUFFER_VIEWS$1||!TypedArrayPrototype||TypedArrayPrototype===ObjectPrototype$1)&&(TypedArrayPrototype=TypedArray.prototype,NATIVE_ARRAY_BUFFER_VIEWS$1))for(NAME in TypedArrayConstructorsList)global$1[NAME]&&objectSetPrototypeOf(global$1[NAME].prototype,TypedArrayPrototype);if(NATIVE_ARRAY_BUFFER_VIEWS$1&&objectGetPrototypeOf(Uint8ClampedArrayPrototype)!==TypedArrayPrototype&&objectSetPrototypeOf(Uint8ClampedArrayPrototype,TypedArrayPrototype),descriptors&&!has$1(TypedArrayPrototype,TO_STRING_TAG$1))for(NAME in TYPED_ARRAY_TAG_REQIRED=!0,defineProperty$1(TypedArrayPrototype,TO_STRING_TAG$1,{get:function(){return isObject(this)?this[TYPED_ARRAY_TAG]:void 0}}),TypedArrayConstructorsList)global$1[NAME]&&createNonEnumerableProperty(global$1[NAME],TYPED_ARRAY_TAG,NAME);var arrayBufferViewCore={NATIVE_ARRAY_BUFFER_VIEWS:NATIVE_ARRAY_BUFFER_VIEWS$1,TYPED_ARRAY_CONSTRUCTOR:TYPED_ARRAY_CONSTRUCTOR$1,TYPED_ARRAY_TAG:TYPED_ARRAY_TAG_REQIRED&&TYPED_ARRAY_TAG,aTypedArray:aTypedArray$m,aTypedArrayConstructor:aTypedArrayConstructor$2,exportTypedArrayMethod:exportTypedArrayMethod$n,exportTypedArrayStaticMethod:exportTypedArrayStaticMethod,isView:isView,isTypedArray:isTypedArray,TypedArray:TypedArray,TypedArrayPrototype:TypedArrayPrototype},NATIVE_ARRAY_BUFFER_VIEWS=arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS,ArrayBuffer$1=global$1.ArrayBuffer,Int8Array$2=global$1.Int8Array,typedArrayConstructorsRequireWrappers=!NATIVE_ARRAY_BUFFER_VIEWS||!fails((function(){Int8Array$2(1)}))||!fails((function(){new Int8Array$2(-1)}))||!checkCorrectnessOfIteration((function(e){new Int8Array$2,new Int8Array$2(null),new Int8Array$2(1.5),new Int8Array$2(e)}),!0)||fails((function(){return 1!==new Int8Array$2(new ArrayBuffer$1(2),1,void 0).length})),toIndex=function(e){if(void 0===e)return 0;var r=toInteger(e),t=toLength(r);if(r!==t)throw RangeError(\"Wrong length or index\");return t},abs=Math.abs,pow$1=Math.pow,floor$6=Math.floor,log=Math.log,LN2=Math.LN2,pack=function(e,r,t){var a,i,s,c=new Array(t),l=8*t-r-1,u=(1<<l)-1,p=u>>1,d=23===r?pow$1(2,-24)-pow$1(2,-77):0,h=e<0||0===e&&1/e<0?1:0,y=0;for((e=abs(e))!=e||e===1/0?(i=e!=e?1:0,a=u):(a=floor$6(log(e)/LN2),e*(s=pow$1(2,-a))<1&&(a--,s*=2),(e+=a+p>=1?d/s:d*pow$1(2,1-p))*s>=2&&(a++,s/=2),a+p>=u?(i=0,a=u):a+p>=1?(i=(e*s-1)*pow$1(2,r),a+=p):(i=e*pow$1(2,p-1)*pow$1(2,r),a=0));r>=8;c[y++]=255&i,i/=256,r-=8);for(a=a<<r|i,l+=r;l>0;c[y++]=255&a,a/=256,l-=8);return c[--y]|=128*h,c},unpack=function(e,r){var t,a=e.length,i=8*a-r-1,s=(1<<i)-1,c=s>>1,l=i-7,u=a-1,p=e[u--],d=127&p;for(p>>=7;l>0;d=256*d+e[u],u--,l-=8);for(t=d&(1<<-l)-1,d>>=-l,l+=r;l>0;t=256*t+e[u],u--,l-=8);if(0===d)d=1-c;else{if(d===s)return t?NaN:p?-1/0:1/0;t+=pow$1(2,r),d-=c}return(p?-1:1)*t*pow$1(2,d-r)},ieee754={pack:pack,unpack:unpack},arrayFill=function fill(e){for(var r=toObject(this),t=toLength(r.length),a=arguments.length,i=toAbsoluteIndex(a>1?arguments[1]:void 0,t),s=a>2?arguments[2]:void 0,c=void 0===s?t:toAbsoluteIndex(s,t);c>i;)r[i++]=e;return r},getOwnPropertyNames=objectGetOwnPropertyNames.f,defineProperty=objectDefineProperty.f,PROPER_FUNCTION_NAME$2=functionName.PROPER,CONFIGURABLE_FUNCTION_NAME=functionName.CONFIGURABLE,getInternalState$1=internalState.get,setInternalState$3=internalState.set,ARRAY_BUFFER=\"ArrayBuffer\",DATA_VIEW=\"DataView\",PROTOTYPE=\"prototype\",WRONG_LENGTH=\"Wrong length\",WRONG_INDEX=\"Wrong index\",NativeArrayBuffer=global$1[ARRAY_BUFFER],$ArrayBuffer=NativeArrayBuffer,$DataView=global$1[DATA_VIEW],$DataViewPrototype=$DataView&&$DataView[PROTOTYPE],ObjectPrototype=Object.prototype,RangeError$1=global$1.RangeError,packIEEE754=ieee754.pack,unpackIEEE754=ieee754.unpack,packInt8=function(e){return[255&e]},packInt16=function(e){return[255&e,e>>8&255]},packInt32=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},unpackInt32=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},packFloat32=function(e){return packIEEE754(e,23,4)},packFloat64=function(e){return packIEEE754(e,52,8)},addGetter=function(e,r){defineProperty(e[PROTOTYPE],r,{get:function(){return getInternalState$1(this)[r]}})},get=function(e,r,t,a){var i=toIndex(t),s=getInternalState$1(e);if(i+r>s.byteLength)throw RangeError$1(WRONG_INDEX);var c=getInternalState$1(s.buffer).bytes,l=i+s.byteOffset,u=c.slice(l,l+r);return a?u:u.reverse()},set=function(e,r,t,a,i,s){var c=toIndex(t),l=getInternalState$1(e);if(c+r>l.byteLength)throw RangeError$1(WRONG_INDEX);for(var u=getInternalState$1(l.buffer).bytes,p=c+l.byteOffset,d=a(+i),h=0;h<r;h++)u[p+h]=d[s?h:r-h-1]};if(arrayBufferNative){var INCORRECT_ARRAY_BUFFER_NAME=PROPER_FUNCTION_NAME$2&&NativeArrayBuffer.name!==ARRAY_BUFFER;if(fails((function(){NativeArrayBuffer(1)}))&&fails((function(){new NativeArrayBuffer(-1)}))&&!fails((function(){return new NativeArrayBuffer,new NativeArrayBuffer(1.5),new NativeArrayBuffer(NaN),INCORRECT_ARRAY_BUFFER_NAME&&!CONFIGURABLE_FUNCTION_NAME})))INCORRECT_ARRAY_BUFFER_NAME&&CONFIGURABLE_FUNCTION_NAME&&createNonEnumerableProperty(NativeArrayBuffer,\"name\",ARRAY_BUFFER);else{$ArrayBuffer=function ArrayBuffer(e){return anInstance(this,$ArrayBuffer),new NativeArrayBuffer(toIndex(e))};for(var ArrayBufferPrototype=$ArrayBuffer[PROTOTYPE]=NativeArrayBuffer[PROTOTYPE],keys=getOwnPropertyNames(NativeArrayBuffer),j=0,key;keys.length>j;)(key=keys[j++])in $ArrayBuffer||createNonEnumerableProperty($ArrayBuffer,key,NativeArrayBuffer[key]);ArrayBufferPrototype.constructor=$ArrayBuffer}objectSetPrototypeOf&&objectGetPrototypeOf($DataViewPrototype)!==ObjectPrototype&&objectSetPrototypeOf($DataViewPrototype,ObjectPrototype);var testView=new $DataView(new $ArrayBuffer(2)),$setInt8=$DataViewPrototype.setInt8;testView.setInt8(0,2147483648),testView.setInt8(1,2147483649),!testView.getInt8(0)&&testView.getInt8(1)||redefineAll($DataViewPrototype,{setInt8:function setInt8(e,r){$setInt8.call(this,e,r<<24>>24)},setUint8:function setUint8(e,r){$setInt8.call(this,e,r<<24>>24)}},{unsafe:!0})}else $ArrayBuffer=function ArrayBuffer(e){anInstance(this,$ArrayBuffer,ARRAY_BUFFER);var r=toIndex(e);setInternalState$3(this,{bytes:arrayFill.call(new Array(r),0),byteLength:r}),descriptors||(this.byteLength=r)},$DataView=function DataView(e,r,t){anInstance(this,$DataView,DATA_VIEW),anInstance(e,$ArrayBuffer,DATA_VIEW);var a=getInternalState$1(e).byteLength,i=toInteger(r);if(i<0||i>a)throw RangeError$1(\"Wrong offset\");if(i+(t=void 0===t?a-i:toLength(t))>a)throw RangeError$1(WRONG_LENGTH);setInternalState$3(this,{buffer:e,byteLength:t,byteOffset:i}),descriptors||(this.buffer=e,this.byteLength=t,this.byteOffset=i)},descriptors&&(addGetter($ArrayBuffer,\"byteLength\"),addGetter($DataView,\"buffer\"),addGetter($DataView,\"byteLength\"),addGetter($DataView,\"byteOffset\")),redefineAll($DataView[PROTOTYPE],{getInt8:function getInt8(e){return get(this,1,e)[0]<<24>>24},getUint8:function getUint8(e){return get(this,1,e)[0]},getInt16:function getInt16(e){var r=get(this,2,e,arguments.length>1?arguments[1]:void 0);return(r[1]<<8|r[0])<<16>>16},getUint16:function getUint16(e){var r=get(this,2,e,arguments.length>1?arguments[1]:void 0);return r[1]<<8|r[0]},getInt32:function getInt32(e){return unpackInt32(get(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function getUint32(e){return unpackInt32(get(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function getFloat32(e){return unpackIEEE754(get(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function getFloat64(e){return unpackIEEE754(get(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function setInt8(e,r){set(this,1,e,packInt8,r)},setUint8:function setUint8(e,r){set(this,1,e,packInt8,r)},setInt16:function setInt16(e,r){set(this,2,e,packInt16,r,arguments.length>2?arguments[2]:void 0)},setUint16:function setUint16(e,r){set(this,2,e,packInt16,r,arguments.length>2?arguments[2]:void 0)},setInt32:function setInt32(e,r){set(this,4,e,packInt32,r,arguments.length>2?arguments[2]:void 0)},setUint32:function setUint32(e,r){set(this,4,e,packInt32,r,arguments.length>2?arguments[2]:void 0)},setFloat32:function setFloat32(e,r){set(this,4,e,packFloat32,r,arguments.length>2?arguments[2]:void 0)},setFloat64:function setFloat64(e,r){set(this,8,e,packFloat64,r,arguments.length>2?arguments[2]:void 0)}});setToStringTag($ArrayBuffer,ARRAY_BUFFER),setToStringTag($DataView,DATA_VIEW);var arrayBuffer={ArrayBuffer:$ArrayBuffer,DataView:$DataView},floor$5=Math.floor,isInteger=function isInteger(e){return!isObject(e)&&isFinite(e)&&floor$5(e)===e},toPositiveInteger=function(e){var r=toInteger(e);if(r<0)throw RangeError(\"The argument can't be less than 0\");return r},toOffset=function(e,r){var t=toPositiveInteger(e);if(t%r)throw RangeError(\"Wrong offset\");return t},aTypedArrayConstructor$1=arrayBufferViewCore.aTypedArrayConstructor,typedArrayFrom=function from(e){var r,t,a,i,s,c,l=aConstructor(this),u=toObject(e),p=arguments.length,d=p>1?arguments[1]:void 0,h=void 0!==d,y=getIteratorMethod(u);if(y&&!isArrayIteratorMethod(y))for(c=(s=getIterator(u,y)).next,u=[];!(i=c.call(s)).done;)u.push(i.value);for(h&&p>2&&(d=functionBindContext(d,arguments[2],2)),t=toLength(u.length),a=new(aTypedArrayConstructor$1(l))(t),r=0;t>r;r++)a[r]=h?d(u[r],r):u[r];return a},isArray=Array.isArray||function isArray(e){return\"Array\"==classofRaw(e)},SPECIES$2=wellKnownSymbol(\"species\"),arraySpeciesConstructor=function(e){var r;return isArray(e)&&(r=e.constructor,(isConstructor(r)&&(r===Array||isArray(r.prototype))||isObject(r)&&null===(r=r[SPECIES$2]))&&(r=void 0)),void 0===r?Array:r},arraySpeciesCreate=function(e,r){return new(arraySpeciesConstructor(e))(0===r?0:r)},push=[].push,createMethod$2=function(e){var r=1==e,t=2==e,a=3==e,i=4==e,s=6==e,c=7==e,l=5==e||s;return function(u,p,d,h){for(var y,A,g=toObject(u),v=indexedObject(g),E=functionBindContext(p,d,3),m=toLength(v.length),I=0,P=h||arraySpeciesCreate,b=r?P(u,m):t||c?P(u,0):void 0;m>I;I++)if((l||I in v)&&(A=E(y=v[I],I,g),e))if(r)b[I]=A;else if(A)switch(e){case 3:return!0;case 5:return y;case 6:return I;case 2:push.call(b,y)}else switch(e){case 4:return!1;case 7:push.call(b,y)}return s?-1:a||i?i:b}},arrayIteration={forEach:createMethod$2(0),map:createMethod$2(1),filter:createMethod$2(2),some:createMethod$2(3),every:createMethod$2(4),find:createMethod$2(5),findIndex:createMethod$2(6),filterReject:createMethod$2(7)},typedArrayConstructor=createCommonjsModule((function(e){var r=objectGetOwnPropertyNames.f,t=arrayIteration.forEach,a=internalState.get,i=internalState.set,s=objectDefineProperty.f,c=objectGetOwnPropertyDescriptor.f,l=Math.round,u=global$1.RangeError,p=arrayBuffer.ArrayBuffer,d=arrayBuffer.DataView,h=arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS,y=arrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR,A=arrayBufferViewCore.TYPED_ARRAY_TAG,g=arrayBufferViewCore.TypedArray,v=arrayBufferViewCore.TypedArrayPrototype,E=arrayBufferViewCore.aTypedArrayConstructor,m=arrayBufferViewCore.isTypedArray,fromList=function(e,r){for(var t=0,a=r.length,i=new(E(e))(a);a>t;)i[t]=r[t++];return i},addGetter=function(e,r){s(e,r,{get:function(){return a(this)[r]}})},isArrayBuffer=function(e){var r;return e instanceof p||\"ArrayBuffer\"==(r=classof(e))||\"SharedArrayBuffer\"==r},isTypedArrayIndex=function(e,r){return m(e)&&!isSymbol(r)&&r in e&&isInteger(+r)&&r>=0},I=function getOwnPropertyDescriptor(e,r){return r=toPropertyKey(r),isTypedArrayIndex(e,r)?createPropertyDescriptor(2,e[r]):c(e,r)},P=function defineProperty(e,r,t){return r=toPropertyKey(r),!(isTypedArrayIndex(e,r)&&isObject(t)&&has$1(t,\"value\"))||has$1(t,\"get\")||has$1(t,\"set\")||t.configurable||has$1(t,\"writable\")&&!t.writable||has$1(t,\"enumerable\")&&!t.enumerable?s(e,r,t):(e[r]=t.value,e)};descriptors?(h||(objectGetOwnPropertyDescriptor.f=I,objectDefineProperty.f=P,addGetter(v,\"buffer\"),addGetter(v,\"byteOffset\"),addGetter(v,\"byteLength\"),addGetter(v,\"length\")),_export({target:\"Object\",stat:!0,forced:!h},{getOwnPropertyDescriptor:I,defineProperty:P}),e.exports=function(e,c,E){var I=e.match(/\\d+$/)[0]/8,P=e+(E?\"Clamped\":\"\")+\"Array\",b=\"get\"+e,T=\"set\"+e,S=global$1[P],R=S,_=R&&R.prototype,U={},addElement=function(e,r){s(e,r,{get:function(){return function(e,r){var t=a(e);return t.view[b](r*I+t.byteOffset,!0)}(this,r)},set:function(e){return function(e,r,t){var i=a(e);E&&(t=(t=l(t))<0?0:t>255?255:255&t),i.view[T](r*I+i.byteOffset,t,!0)}(this,r,e)},enumerable:!0})};h?typedArrayConstructorsRequireWrappers&&(R=c((function(e,r,t,a){return anInstance(e,R,P),inheritIfRequired(isObject(r)?isArrayBuffer(r)?void 0!==a?new S(r,toOffset(t,I),a):void 0!==t?new S(r,toOffset(t,I)):new S(r):m(r)?fromList(R,r):typedArrayFrom.call(R,r):new S(toIndex(r)),e,R)})),objectSetPrototypeOf&&objectSetPrototypeOf(R,g),t(r(S),(function(e){e in R||createNonEnumerableProperty(R,e,S[e])})),R.prototype=_):(R=c((function(e,r,t,a){anInstance(e,R,P);var s,c,l,h=0,y=0;if(isObject(r)){if(!isArrayBuffer(r))return m(r)?fromList(R,r):typedArrayFrom.call(R,r);s=r,y=toOffset(t,I);var A=r.byteLength;if(void 0===a){if(A%I)throw u(\"Wrong length\");if((c=A-y)<0)throw u(\"Wrong length\")}else if((c=toLength(a)*I)+y>A)throw u(\"Wrong length\");l=c/I}else l=toIndex(r),s=new p(c=l*I);for(i(e,{buffer:s,byteOffset:y,byteLength:c,length:l,view:new d(s)});h<l;)addElement(e,h++)})),objectSetPrototypeOf&&objectSetPrototypeOf(R,g),_=R.prototype=objectCreate(v)),_.constructor!==R&&createNonEnumerableProperty(_,\"constructor\",R),createNonEnumerableProperty(_,y,R),A&&createNonEnumerableProperty(_,A,P),U[P]=R,_export({global:!0,forced:R!=S,sham:!h},U),\"BYTES_PER_ELEMENT\"in R||createNonEnumerableProperty(R,\"BYTES_PER_ELEMENT\",I),\"BYTES_PER_ELEMENT\"in _||createNonEnumerableProperty(_,\"BYTES_PER_ELEMENT\",I),setSpecies(P)}):e.exports=function(){}}));typedArrayConstructor(\"Uint8\",(function(e){return function Uint8Array(r,t,a){return e(this,r,t,a)}}));var min$3=Math.min,arrayCopyWithin=[].copyWithin||function copyWithin(e,r){var t=toObject(this),a=toLength(t.length),i=toAbsoluteIndex(e,a),s=toAbsoluteIndex(r,a),c=arguments.length>2?arguments[2]:void 0,l=min$3((void 0===c?a:toAbsoluteIndex(c,a))-s,a-i),u=1;for(s<i&&i<s+l&&(u=-1,s+=l-1,i+=l-1);l-- >0;)s in t?t[i]=t[s]:delete t[i],i+=u,s+=u;return t},aTypedArray$l=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$m=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$m(\"copyWithin\",(function copyWithin(e,r){return arrayCopyWithin.call(aTypedArray$l(this),e,r,arguments.length>2?arguments[2]:void 0)}));var $every=arrayIteration.every,aTypedArray$k=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$l=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$l(\"every\",(function every(e){return $every(aTypedArray$k(this),e,arguments.length>1?arguments[1]:void 0)}));var aTypedArray$j=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$k=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$k(\"fill\",(function fill(e){return arrayFill.apply(aTypedArray$j(this),arguments)}));var arrayFromConstructorAndList=function(e,r){for(var t=0,a=r.length,i=new e(a);a>t;)i[t]=r[t++];return i},TYPED_ARRAY_CONSTRUCTOR=arrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR,aTypedArrayConstructor=arrayBufferViewCore.aTypedArrayConstructor,typedArraySpeciesConstructor=function(e){return aTypedArrayConstructor(speciesConstructor(e,e[TYPED_ARRAY_CONSTRUCTOR]))},typedArrayFromSpeciesAndList=function(e,r){return arrayFromConstructorAndList(typedArraySpeciesConstructor(e),r)},$filter$1=arrayIteration.filter,aTypedArray$i=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$j=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$j(\"filter\",(function filter(e){var r=$filter$1(aTypedArray$i(this),e,arguments.length>1?arguments[1]:void 0);return typedArrayFromSpeciesAndList(this,r)}));var $find=arrayIteration.find,aTypedArray$h=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$i=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$i(\"find\",(function find(e){return $find(aTypedArray$h(this),e,arguments.length>1?arguments[1]:void 0)}));var $findIndex=arrayIteration.findIndex,aTypedArray$g=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$h=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$h(\"findIndex\",(function findIndex(e){return $findIndex(aTypedArray$g(this),e,arguments.length>1?arguments[1]:void 0)}));var $forEach$1=arrayIteration.forEach,aTypedArray$f=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$g=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$g(\"forEach\",(function forEach(e){$forEach$1(aTypedArray$f(this),e,arguments.length>1?arguments[1]:void 0)}));var $includes$1=arrayIncludes.includes,aTypedArray$e=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$f=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$f(\"includes\",(function includes(e){return $includes$1(aTypedArray$e(this),e,arguments.length>1?arguments[1]:void 0)}));var $indexOf=arrayIncludes.indexOf,aTypedArray$d=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$e=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$e(\"indexOf\",(function indexOf(e){return $indexOf(aTypedArray$d(this),e,arguments.length>1?arguments[1]:void 0)}));var PROPER_FUNCTION_NAME$1=functionName.PROPER,ITERATOR$3=wellKnownSymbol(\"iterator\"),Uint8Array$2=global$1.Uint8Array,arrayValues=es_array_iterator.values,arrayKeys=es_array_iterator.keys,arrayEntries=es_array_iterator.entries,aTypedArray$c=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$d=arrayBufferViewCore.exportTypedArrayMethod,nativeTypedArrayIterator=Uint8Array$2&&Uint8Array$2.prototype[ITERATOR$3],PROPER_ARRAY_VALUES_NAME=!!nativeTypedArrayIterator&&\"values\"===nativeTypedArrayIterator.name,typedArrayValues=function values(){return arrayValues.call(aTypedArray$c(this))};exportTypedArrayMethod$d(\"entries\",(function entries(){return arrayEntries.call(aTypedArray$c(this))})),exportTypedArrayMethod$d(\"keys\",(function keys(){return arrayKeys.call(aTypedArray$c(this))})),exportTypedArrayMethod$d(\"values\",typedArrayValues,PROPER_FUNCTION_NAME$1&&!PROPER_ARRAY_VALUES_NAME),exportTypedArrayMethod$d(ITERATOR$3,typedArrayValues,PROPER_FUNCTION_NAME$1&&!PROPER_ARRAY_VALUES_NAME);var aTypedArray$b=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$c=arrayBufferViewCore.exportTypedArrayMethod,$join=[].join;exportTypedArrayMethod$c(\"join\",(function join(e){return $join.apply(aTypedArray$b(this),arguments)}));var arrayMethodIsStrict=function(e,r){var t=[][e];return!!t&&fails((function(){t.call(null,r||function(){throw 1},1)}))},min$2=Math.min,$lastIndexOf=[].lastIndexOf,NEGATIVE_ZERO=!!$lastIndexOf&&1/[1].lastIndexOf(1,-0)<0,STRICT_METHOD$2=arrayMethodIsStrict(\"lastIndexOf\"),FORCED$5=NEGATIVE_ZERO||!STRICT_METHOD$2,arrayLastIndexOf=FORCED$5?function lastIndexOf(e){if(NEGATIVE_ZERO)return $lastIndexOf.apply(this,arguments)||0;var r=toIndexedObject(this),t=toLength(r.length),a=t-1;for(arguments.length>1&&(a=min$2(a,toInteger(arguments[1]))),a<0&&(a=t+a);a>=0;a--)if(a in r&&r[a]===e)return a||0;return-1}:$lastIndexOf,aTypedArray$a=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$b=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$b(\"lastIndexOf\",(function lastIndexOf(e){return arrayLastIndexOf.apply(aTypedArray$a(this),arguments)}));var $map=arrayIteration.map,aTypedArray$9=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$a=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$a(\"map\",(function map(e){return $map(aTypedArray$9(this),e,arguments.length>1?arguments[1]:void 0,(function(e,r){return new(typedArraySpeciesConstructor(e))(r)}))}));var createMethod$1=function(e){return function(r,t,a,i){aCallable(t);var s=toObject(r),c=indexedObject(s),l=toLength(s.length),u=e?l-1:0,p=e?-1:1;if(a<2)for(;;){if(u in c){i=c[u],u+=p;break}if(u+=p,e?u<0:l<=u)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?u>=0:l>u;u+=p)u in c&&(i=t(i,c[u],u,s));return i}},arrayReduce={left:createMethod$1(!1),right:createMethod$1(!0)},$reduce=arrayReduce.left,aTypedArray$8=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$9=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$9(\"reduce\",(function reduce(e){return $reduce(aTypedArray$8(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var $reduceRight=arrayReduce.right,aTypedArray$7=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$8=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$8(\"reduceRight\",(function reduceRight(e){return $reduceRight(aTypedArray$7(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var aTypedArray$6=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$7=arrayBufferViewCore.exportTypedArrayMethod,floor$4=Math.floor;exportTypedArrayMethod$7(\"reverse\",(function reverse(){for(var e,r=aTypedArray$6(this).length,t=floor$4(r/2),a=0;a<t;)e=this[a],this[a++]=this[--r],this[r]=e;return this}));var aTypedArray$5=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$6=arrayBufferViewCore.exportTypedArrayMethod,FORCED$4=fails((function(){new Int8Array(1).set({})}));exportTypedArrayMethod$6(\"set\",(function set(e){aTypedArray$5(this);var r=toOffset(arguments.length>1?arguments[1]:void 0,1),t=this.length,a=toObject(e),i=toLength(a.length),s=0;if(i+r>t)throw RangeError(\"Wrong length\");for(;s<i;)this[r+s]=a[s++]}),FORCED$4);var aTypedArray$4=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$5=arrayBufferViewCore.exportTypedArrayMethod,$slice$1=[].slice,FORCED$3=fails((function(){new Int8Array(1).slice()}));exportTypedArrayMethod$5(\"slice\",(function slice(e,r){for(var t=$slice$1.call(aTypedArray$4(this),e,r),a=typedArraySpeciesConstructor(this),i=0,s=t.length,c=new a(s);s>i;)c[i]=t[i++];return c}),FORCED$3);var $some=arrayIteration.some,aTypedArray$3=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$4=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$4(\"some\",(function some(e){return $some(aTypedArray$3(this),e,arguments.length>1?arguments[1]:void 0)}));var floor$3=Math.floor,mergeSort=function(e,r){var t=e.length,a=floor$3(t/2);return t<8?insertionSort(e,r):merge(mergeSort(e.slice(0,a),r),mergeSort(e.slice(a),r),r)},insertionSort=function(e,r){for(var t,a,i=e.length,s=1;s<i;){for(a=s,t=e[s];a&&r(e[a-1],t)>0;)e[a]=e[--a];a!==s++&&(e[a]=t)}return e},merge=function(e,r,t){for(var a=e.length,i=r.length,s=0,c=0,l=[];s<a||c<i;)s<a&&c<i?l.push(t(e[s],r[c])<=0?e[s++]:r[c++]):l.push(s<a?e[s++]:r[c++]);return l},arraySort=mergeSort,firefox=engineUserAgent.match(/firefox\\/(\\d+)/i),engineFfVersion=!!firefox&&+firefox[1],engineIsIeOrEdge=/MSIE|Trident/.test(engineUserAgent),webkit=engineUserAgent.match(/AppleWebKit\\/(\\d+)\\./),engineWebkitVersion=!!webkit&&+webkit[1],aTypedArray$2=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$3=arrayBufferViewCore.exportTypedArrayMethod,Uint16Array$1=global$1.Uint16Array,nativeSort$1=Uint16Array$1&&Uint16Array$1.prototype.sort,ACCEPT_INCORRECT_ARGUMENTS=!!nativeSort$1&&!fails((function(){var e=new Uint16Array$1(2);e.sort(null),e.sort({})})),STABLE_SORT$1=!!nativeSort$1&&!fails((function(){if(engineV8Version)return engineV8Version<74;if(engineFfVersion)return engineFfVersion<67;if(engineIsIeOrEdge)return!0;if(engineWebkitVersion)return engineWebkitVersion<602;var e,r,t=new Uint16Array$1(516),a=Array(516);for(e=0;e<516;e++)r=e%4,t[e]=515-e,a[e]=e-2*r+3;for(t.sort((function(e,r){return(e/4|0)-(r/4|0)})),e=0;e<516;e++)if(t[e]!==a[e])return!0})),getSortCompare$1=function(e){return function(r,t){return void 0!==e?+e(r,t)||0:t!=t?-1:r!=r?1:0===r&&0===t?1/r>0&&1/t<0?1:-1:r>t}};exportTypedArrayMethod$3(\"sort\",(function sort(e){if(void 0!==e&&aCallable(e),STABLE_SORT$1)return nativeSort$1.call(this,e);aTypedArray$2(this);var r,t=toLength(this.length),a=Array(t);for(r=0;r<t;r++)a[r]=this[r];for(a=arraySort(this,getSortCompare$1(e)),r=0;r<t;r++)this[r]=a[r];return this}),!STABLE_SORT$1||ACCEPT_INCORRECT_ARGUMENTS);var aTypedArray$1=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$2=arrayBufferViewCore.exportTypedArrayMethod;exportTypedArrayMethod$2(\"subarray\",(function subarray(e,r){var t=aTypedArray$1(this),a=t.length,i=toAbsoluteIndex(e,a);return new(typedArraySpeciesConstructor(t))(t.buffer,t.byteOffset+i*t.BYTES_PER_ELEMENT,toLength((void 0===r?a:toAbsoluteIndex(r,a))-i))}));var Int8Array$1=global$1.Int8Array,aTypedArray=arrayBufferViewCore.aTypedArray,exportTypedArrayMethod$1=arrayBufferViewCore.exportTypedArrayMethod,$toLocaleString=[].toLocaleString,$slice=[].slice,TO_LOCALE_STRING_BUG=!!Int8Array$1&&fails((function(){$toLocaleString.call(new Int8Array$1(1))})),FORCED$2=fails((function(){return[1,2].toLocaleString()!=new Int8Array$1([1,2]).toLocaleString()}))||!fails((function(){Int8Array$1.prototype.toLocaleString.call([1,2])}));exportTypedArrayMethod$1(\"toLocaleString\",(function toLocaleString(){return $toLocaleString.apply(TO_LOCALE_STRING_BUG?$slice.call(aTypedArray(this)):aTypedArray(this),arguments)}),FORCED$2);var exportTypedArrayMethod=arrayBufferViewCore.exportTypedArrayMethod,Uint8Array$1=global$1.Uint8Array,Uint8ArrayPrototype=Uint8Array$1&&Uint8Array$1.prototype||{},arrayToString=[].toString,arrayJoin=[].join;fails((function(){arrayToString.call({})}))&&(arrayToString=function toString(){return arrayJoin.call(this)});var IS_NOT_ARRAY_METHOD=Uint8ArrayPrototype.toString!=arrayToString;exportTypedArrayMethod(\"toString\",arrayToString,IS_NOT_ARRAY_METHOD);var $includes=arrayIncludes.includes;_export({target:\"Array\",proto:!0},{includes:function includes(e){return $includes(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(\"includes\");var notARegexp=function(e){if(isRegexp(e))throw TypeError(\"The method doesn't accept regular expressions\");return e},MATCH=wellKnownSymbol(\"match\"),correctIsRegexpLogic=function(e){var r=/./;try{\"/./\"[e](r)}catch(t){try{return r[MATCH]=!1,\"/./\"[e](r)}catch(e){}}return!1};_export({target:\"String\",proto:!0,forced:!correctIsRegexpLogic(\"includes\")},{includes:function includes(e){return!!~toString(requireObjectCoercible(this)).indexOf(toString(notARegexp(e)),arguments.length>1?arguments[1]:void 0)}});var createProperty=function(e,r,t){var a=toPropertyKey(r);a in e?objectDefineProperty.f(e,a,createPropertyDescriptor(0,t)):e[a]=t},SPECIES$1=wellKnownSymbol(\"species\"),arrayMethodHasSpeciesSupport=function(e){return engineV8Version>=51||!fails((function(){var r=[];return(r.constructor={})[SPECIES$1]=function(){return{foo:1}},1!==r[e](Boolean).foo}))},HAS_SPECIES_SUPPORT$1=arrayMethodHasSpeciesSupport(\"slice\"),SPECIES=wellKnownSymbol(\"species\"),nativeSlice=[].slice,max$1=Math.max;_export({target:\"Array\",proto:!0,forced:!HAS_SPECIES_SUPPORT$1},{slice:function slice(e,r){var t,a,i,s=toIndexedObject(this),c=toLength(s.length),l=toAbsoluteIndex(e,c),u=toAbsoluteIndex(void 0===r?c:r,c);if(isArray(s)&&(t=s.constructor,(isConstructor(t)&&(t===Array||isArray(t.prototype))||isObject(t)&&null===(t=t[SPECIES]))&&(t=void 0),t===Array||void 0===t))return nativeSlice.call(s,l,u);for(a=new(void 0===t?Array:t)(max$1(u-l,0)),i=0;l<u;l++,i++)l in s&&createProperty(a,i,s[l]);return a.length=i,a}}),typedArrayConstructor(\"Uint32\",(function(e){return function Uint32Array(r,t,a){return e(this,r,t,a)}})),typedArrayConstructor(\"Uint16\",(function(e){return function Uint16Array(r,t,a){return e(this,r,t,a)}}));var $filter=arrayIteration.filter,HAS_SPECIES_SUPPORT=arrayMethodHasSpeciesSupport(\"filter\");_export({target:\"Array\",proto:!0,forced:!HAS_SPECIES_SUPPORT},{filter:function filter(e){return $filter(this,e,arguments.length>1?arguments[1]:void 0)}});var PROPER_FUNCTION_NAME=functionName.PROPER,TO_STRING=\"toString\",RegExpPrototype=RegExp.prototype,nativeToString=RegExpPrototype[TO_STRING],NOT_GENERIC=fails((function(){return\"/a/b\"!=nativeToString.call({source:\"a\",flags:\"b\"})})),INCORRECT_NAME=PROPER_FUNCTION_NAME&&nativeToString.name!=TO_STRING;(NOT_GENERIC||INCORRECT_NAME)&&redefine(RegExp.prototype,TO_STRING,(function toString$1(){var e=anObject(this),r=toString(e.source),t=e.flags;return\"/\"+r+\"/\"+toString(void 0===t&&e instanceof RegExp&&!(\"flags\"in RegExpPrototype)?regexpFlags.call(e):t)}),{unsafe:!0});var test=[],nativeSort=test.sort,FAILS_ON_UNDEFINED=fails((function(){test.sort(void 0)})),FAILS_ON_NULL=fails((function(){test.sort(null)})),STRICT_METHOD$1=arrayMethodIsStrict(\"sort\"),STABLE_SORT=!fails((function(){if(engineV8Version)return engineV8Version<70;if(!(engineFfVersion&&engineFfVersion>3)){if(engineIsIeOrEdge)return!0;if(engineWebkitVersion)return engineWebkitVersion<603;var e,r,t,a,i=\"\";for(e=65;e<76;e++){switch(r=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:t=3;break;case 68:case 71:t=4;break;default:t=2}for(a=0;a<47;a++)test.push({k:r+a,v:t})}for(test.sort((function(e,r){return r.v-e.v})),a=0;a<test.length;a++)r=test[a].k.charAt(0),i.charAt(i.length-1)!==r&&(i+=r);return\"DGBEFHACIJK\"!==i}})),FORCED$1=FAILS_ON_UNDEFINED||!FAILS_ON_NULL||!STRICT_METHOD$1||!STABLE_SORT,getSortCompare=function(e){return function(r,t){return void 0===t?-1:void 0===r?1:void 0!==e?+e(r,t)||0:toString(r)>toString(t)?1:-1}};_export({target:\"Array\",proto:!0,forced:FORCED$1},{sort:function sort(e){void 0!==e&&aCallable(e);var r=toObject(this);if(STABLE_SORT)return void 0===e?nativeSort.call(r):nativeSort.call(r,e);var t,a,i=[],s=toLength(r.length);for(a=0;a<s;a++)a in r&&i.push(r[a]);for(t=(i=arraySort(i,getSortCompare(e))).length,a=0;a<t;)r[a]=i[a++];for(;a<s;)delete r[a++];return r}});var UZIP_1=createCommonjsModule((function(e){var r,t,UZIP={};e.exports=UZIP,UZIP.parse=function(e,r){for(var t=UZIP.bin.readUshort,a=UZIP.bin.readUint,i=0,s={},c=new Uint8Array(e),l=c.length-4;101010256!=a(c,l);)l--;i=l;i+=4;var u=t(c,i+=4);t(c,i+=2);var p=a(c,i+=2),d=a(c,i+=4);i+=4,i=d;for(var h=0;h<u;h++){a(c,i),i+=4,i+=4,i+=4,a(c,i+=4);p=a(c,i+=4);var y=a(c,i+=4),A=t(c,i+=4),g=t(c,i+2),v=t(c,i+4);i+=6;var E=a(c,i+=8);i+=4,i+=A+g+v,UZIP._readLocal(c,E,s,p,y,r)}return s},UZIP._readLocal=function(e,r,t,a,i,s){var c=UZIP.bin.readUshort,l=UZIP.bin.readUint;l(e,r),c(e,r+=4),c(e,r+=2);var u=c(e,r+=2);l(e,r+=2),l(e,r+=4),r+=4;var p=c(e,r+=8),d=c(e,r+=2);r+=2;var h=UZIP.bin.readUTF8(e,r,p);if(r+=p,r+=d,s)t[h]={size:i,csize:a};else{var y=new Uint8Array(e.buffer,r);if(0==u)t[h]=new Uint8Array(y.buffer.slice(r,r+a));else{if(8!=u)throw\"unknown compression method: \"+u;var A=new Uint8Array(i);UZIP.inflateRaw(y,A),t[h]=A}}},UZIP.inflateRaw=function(e,r){return UZIP.F.inflate(e,r)},UZIP.inflate=function(e,r){return e[0],e[1],UZIP.inflateRaw(new Uint8Array(e.buffer,e.byteOffset+2,e.length-6),r)},UZIP.deflate=function(e,r){null==r&&(r={level:6});var t=0,a=new Uint8Array(50+Math.floor(1.1*e.length));a[t]=120,a[t+1]=156,t+=2,t=UZIP.F.deflateRaw(e,a,t,r.level);var i=UZIP.adler(e,0,e.length);return a[t+0]=i>>>24&255,a[t+1]=i>>>16&255,a[t+2]=i>>>8&255,a[t+3]=i>>>0&255,new Uint8Array(a.buffer,0,t+4)},UZIP.deflateRaw=function(e,r){null==r&&(r={level:6});var t=new Uint8Array(50+Math.floor(1.1*e.length)),a=UZIP.F.deflateRaw(e,t,a,r.level);return new Uint8Array(t.buffer,0,a)},UZIP.encode=function(e,r){null==r&&(r=!1);var t=0,a=UZIP.bin.writeUint,i=UZIP.bin.writeUshort,s={};for(var c in e){var l=!UZIP._noNeed(c)&&!r,u=e[c],p=UZIP.crc.crc(u,0,u.length);s[c]={cpr:l,usize:u.length,crc:p,file:l?UZIP.deflateRaw(u):u}}for(var c in s)t+=s[c].file.length+30+46+2*UZIP.bin.sizeUTF8(c);t+=22;var d=new Uint8Array(t),h=0,y=[];for(var c in s){var A=s[c];y.push(h),h=UZIP._writeHeader(d,h,c,A,0)}var g=0,v=h;for(var c in s){A=s[c];y.push(h),h=UZIP._writeHeader(d,h,c,A,1,y[g++])}var E=h-v;return a(d,h,101010256),h+=4,i(d,h+=4,g),i(d,h+=2,g),a(d,h+=2,E),a(d,h+=4,v),h+=4,h+=2,d.buffer},UZIP._noNeed=function(e){var r=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(r)},UZIP._writeHeader=function(e,r,t,a,i,s){var c=UZIP.bin.writeUint,l=UZIP.bin.writeUshort,u=a.file;return c(e,r,0==i?67324752:33639248),r+=4,1==i&&(r+=2),l(e,r,20),l(e,r+=2,0),l(e,r+=2,a.cpr?8:0),c(e,r+=2,0),c(e,r+=4,a.crc),c(e,r+=4,u.length),c(e,r+=4,a.usize),l(e,r+=4,UZIP.bin.sizeUTF8(t)),l(e,r+=2,0),r+=2,1==i&&(r+=2,r+=2,c(e,r+=6,s),r+=4),r+=UZIP.bin.writeUTF8(e,r,t),0==i&&(e.set(u,r),r+=u.length),r},UZIP.crc={table:function(){for(var e=new Uint32Array(256),r=0;r<256;r++){for(var t=r,a=0;a<8;a++)1&t?t=3988292384^t>>>1:t>>>=1;e[r]=t}return e}(),update:function(e,r,t,a){for(var i=0;i<a;i++)e=UZIP.crc.table[255&(e^r[t+i])]^e>>>8;return e},crc:function(e,r,t){return 4294967295^UZIP.crc.update(4294967295,e,r,t)}},UZIP.adler=function(e,r,t){for(var a=1,i=0,s=r,c=r+t;s<c;){for(var l=Math.min(s+5552,c);s<l;)i+=a+=e[s++];a%=65521,i%=65521}return i<<16|a},UZIP.bin={readUshort:function(e,r){return e[r]|e[r+1]<<8},writeUshort:function(e,r,t){e[r]=255&t,e[r+1]=t>>8&255},readUint:function(e,r){return 16777216*e[r+3]+(e[r+2]<<16|e[r+1]<<8|e[r])},writeUint:function(e,r,t){e[r]=255&t,e[r+1]=t>>8&255,e[r+2]=t>>16&255,e[r+3]=t>>24&255},readASCII:function(e,r,t){for(var a=\"\",i=0;i<t;i++)a+=String.fromCharCode(e[r+i]);return a},writeASCII:function(e,r,t){for(var a=0;a<t.length;a++)e[r+a]=t.charCodeAt(a)},pad:function(e){return e.length<2?\"0\"+e:e},readUTF8:function(e,r,t){for(var a,i=\"\",s=0;s<t;s++)i+=\"%\"+UZIP.bin.pad(e[r+s].toString(16));try{a=decodeURIComponent(i)}catch(a){return UZIP.bin.readASCII(e,r,t)}return a},writeUTF8:function(e,r,t){for(var a=t.length,i=0,s=0;s<a;s++){var c=t.charCodeAt(s);if(0==(4294967168&c))e[r+i]=c,i++;else if(0==(4294965248&c))e[r+i]=192|c>>6,e[r+i+1]=128|c>>0&63,i+=2;else if(0==(4294901760&c))e[r+i]=224|c>>12,e[r+i+1]=128|c>>6&63,e[r+i+2]=128|c>>0&63,i+=3;else{if(0!=(4292870144&c))throw\"e\";e[r+i]=240|c>>18,e[r+i+1]=128|c>>12&63,e[r+i+2]=128|c>>6&63,e[r+i+3]=128|c>>0&63,i+=4}}return i},sizeUTF8:function(e){for(var r=e.length,t=0,a=0;a<r;a++){var i=e.charCodeAt(a);if(0==(4294967168&i))t++;else if(0==(4294965248&i))t+=2;else if(0==(4294901760&i))t+=3;else{if(0!=(4292870144&i))throw\"e\";t+=4}}return t}},UZIP.F={},UZIP.F.deflateRaw=function(e,r,t,a){var i=[[0,0,0,0,0],[4,4,8,4,0],[4,5,16,8,0],[4,6,16,16,0],[4,10,16,32,0],[8,16,32,32,0],[8,16,128,128,0],[8,32,128,256,0],[32,128,258,1024,1],[32,258,258,4096,1]][a],s=UZIP.F.U,c=UZIP.F._goodIndex;UZIP.F._hash;var l=UZIP.F._putsE,u=0,p=t<<3,d=0,h=e.length;if(0==a){for(;u<h;){l(r,p,u+(R=Math.min(65535,h-u))==h?1:0),p=UZIP.F._copyExact(e,u,R,r,p+8),u+=R}return p>>>3}var y=s.lits,A=s.strt,g=s.prev,v=0,E=0,m=0,I=0,P=0,b=0;for(h>2&&(A[b=UZIP.F._hash(e,0)]=0),u=0;u<h;u++){if(P=b,u+1<h-2){b=UZIP.F._hash(e,u+1);var T=u+1&32767;g[T]=A[b],A[b]=T}if(d<=u){(v>14e3||E>26697)&&h-u>100&&(d<u&&(y[v]=u-d,v+=2,d=u),p=UZIP.F._writeBlock(u==h-1||d==h?1:0,y,v,I,e,m,u-m,r,p),v=E=I=0,m=u);var S=0;u<h-2&&(S=UZIP.F._bestMatch(e,u,g,P,Math.min(i[2],h-u),i[3]));var R=S>>>16,_=65535&S;if(0!=S){_=65535&S;var U=c(R=S>>>16,s.of0);s.lhst[257+U]++;var w=c(_,s.df0);s.dhst[w]++,I+=s.exb[U]+s.dxb[w],y[v]=R<<23|u-d,y[v+1]=_<<16|U<<8|w,v+=2,d=u+R}else s.lhst[e[u]]++;E++}}for(m==u&&0!=e.length||(d<u&&(y[v]=u-d,v+=2,d=u),p=UZIP.F._writeBlock(1,y,v,I,e,m,u-m,r,p),v=0,E=0,v=E=I=0,m=u);0!=(7&p);)p++;return p>>>3},UZIP.F._bestMatch=function(e,r,t,a,i,s){var c=32767&r,l=t[c],u=c-l+32768&32767;if(l==c||a!=UZIP.F._hash(e,r-u))return 0;for(var p=0,d=0,h=Math.min(32767,r);u<=h&&0!=--s&&l!=c;){if(0==p||e[r+p]==e[r+p-u]){var y=UZIP.F._howLong(e,r,u);if(y>p){if(d=u,(p=y)>=i)break;u+2<y&&(y=u+2);for(var A=0,g=0;g<y-2;g++){var v=r-u+g+32768&32767,E=v-t[v]+32768&32767;E>A&&(A=E,l=v)}}}u+=(c=l)-(l=t[c])+32768&32767}return p<<16|d},UZIP.F._howLong=function(e,r,t){if(e[r]!=e[r-t]||e[r+1]!=e[r+1-t]||e[r+2]!=e[r+2-t])return 0;var a=r,i=Math.min(e.length,r+258);for(r+=3;r<i&&e[r]==e[r-t];)r++;return r-a},UZIP.F._hash=function(e,r){return(e[r]<<8|e[r+1])+(e[r+2]<<4)&65535},UZIP.saved=0,UZIP.F._writeBlock=function(e,r,t,a,i,s,c,l,u){var p,d,h,y,A,g,v,E,m,I=UZIP.F.U,P=UZIP.F._putsF,b=UZIP.F._putsE;I.lhst[256]++,d=(p=UZIP.F.getTrees())[0],h=p[1],y=p[2],A=p[3],g=p[4],v=p[5],E=p[6],m=p[7];var T=32+(0==(u+3&7)?0:8-(u+3&7))+(c<<3),S=a+UZIP.F.contSize(I.fltree,I.lhst)+UZIP.F.contSize(I.fdtree,I.dhst),R=a+UZIP.F.contSize(I.ltree,I.lhst)+UZIP.F.contSize(I.dtree,I.dhst);R+=14+3*v+UZIP.F.contSize(I.itree,I.ihst)+(2*I.ihst[16]+3*I.ihst[17]+7*I.ihst[18]);for(var _=0;_<286;_++)I.lhst[_]=0;for(_=0;_<30;_++)I.dhst[_]=0;for(_=0;_<19;_++)I.ihst[_]=0;var U=T<S&&T<R?0:S<R?1:2;if(P(l,u,e),P(l,u+1,U),u+=3,0==U){for(;0!=(7&u);)u++;u=UZIP.F._copyExact(i,s,c,l,u)}else{var w,O;if(1==U&&(w=I.fltree,O=I.fdtree),2==U){UZIP.F.makeCodes(I.ltree,d),UZIP.F.revCodes(I.ltree,d),UZIP.F.makeCodes(I.dtree,h),UZIP.F.revCodes(I.dtree,h),UZIP.F.makeCodes(I.itree,y),UZIP.F.revCodes(I.itree,y),w=I.ltree,O=I.dtree,b(l,u,A-257),b(l,u+=5,g-1),b(l,u+=5,v-4),u+=4;for(var C=0;C<v;C++)b(l,u+3*C,I.itree[1+(I.ordr[C]<<1)]);u+=3*v,u=UZIP.F._codeTiny(E,I.itree,l,u),u=UZIP.F._codeTiny(m,I.itree,l,u)}for(var $=s,L=0;L<t;L+=2){for(var x=r[L],M=x>>>23,B=$+(8388607&x);$<B;)u=UZIP.F._writeLit(i[$++],w,l,u);if(0!=M){var D=r[L+1],G=D>>16,V=D>>8&255,k=255&D;b(l,u=UZIP.F._writeLit(257+V,w,l,u),M-I.of0[V]),u+=I.exb[V],P(l,u=UZIP.F._writeLit(k,O,l,u),G-I.df0[k]),u+=I.dxb[k],$+=M}}u=UZIP.F._writeLit(256,w,l,u)}return u},UZIP.F._copyExact=function(e,r,t,a,i){var s=i>>>3;return a[s]=t,a[s+1]=t>>>8,a[s+2]=255-a[s],a[s+3]=255-a[s+1],s+=4,a.set(new Uint8Array(e.buffer,r,t),s),i+(t+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,r=UZIP.F._hufTree(e.lhst,e.ltree,15),t=UZIP.F._hufTree(e.dhst,e.dtree,15),a=[],i=UZIP.F._lenCodes(e.ltree,a),s=[],c=UZIP.F._lenCodes(e.dtree,s),l=0;l<a.length;l+=2)e.ihst[a[l]]++;for(l=0;l<s.length;l+=2)e.ihst[s[l]]++;for(var u=UZIP.F._hufTree(e.ihst,e.itree,7),p=19;p>4&&0==e.itree[1+(e.ordr[p-1]<<1)];)p--;return[r,t,u,i,c,p,a,s]},UZIP.F.getSecond=function(e){for(var r=[],t=0;t<e.length;t+=2)r.push(e[t+1]);return r},UZIP.F.nonZero=function(e){for(var r=\"\",t=0;t<e.length;t+=2)0!=e[t+1]&&(r+=(t>>1)+\",\");return r},UZIP.F.contSize=function(e,r){for(var t=0,a=0;a<r.length;a++)t+=r[a]*e[1+(a<<1)];return t},UZIP.F._codeTiny=function(e,r,t,a){for(var i=0;i<e.length;i+=2){var s=e[i],c=e[i+1];a=UZIP.F._writeLit(s,r,t,a);var l=16==s?2:17==s?3:7;s>15&&(UZIP.F._putsE(t,a,c,l),a+=l)}return a},UZIP.F._lenCodes=function(e,r){for(var t=e.length;2!=t&&0==e[t-1];)t-=2;for(var a=0;a<t;a+=2){var i=e[a+1],s=a+3<t?e[a+3]:-1,c=a+5<t?e[a+5]:-1,l=0==a?-1:e[a-1];if(0==i&&s==i&&c==i){for(var u=a+5;u+2<t&&e[u+2]==i;)u+=2;(p=Math.min(u+1-a>>>1,138))<11?r.push(17,p-3):r.push(18,p-11),a+=2*p-2}else if(i==l&&s==i&&c==i){for(u=a+5;u+2<t&&e[u+2]==i;)u+=2;var p=Math.min(u+1-a>>>1,6);r.push(16,p-3),a+=2*p-2}else r.push(i,0)}return t>>>1},UZIP.F._hufTree=function(e,r,t){var a=[],i=e.length,s=r.length,c=0;for(c=0;c<s;c+=2)r[c]=0,r[c+1]=0;for(c=0;c<i;c++)0!=e[c]&&a.push({lit:c,f:e[c]});var l=a.length,u=a.slice(0);if(0==l)return 0;if(1==l){var p=a[0].lit;u=0==p?1:0;return r[1+(p<<1)]=1,r[1+(u<<1)]=1,1}a.sort((function(e,r){return e.f-r.f}));var d=a[0],h=a[1],y=0,A=1,g=2;for(a[0]={lit:-1,f:d.f+h.f,l:d,r:h,d:0};A!=l-1;)d=y!=A&&(g==l||a[y].f<a[g].f)?a[y++]:a[g++],h=y!=A&&(g==l||a[y].f<a[g].f)?a[y++]:a[g++],a[A++]={lit:-1,f:d.f+h.f,l:d,r:h};var v=UZIP.F.setDepth(a[A-1],0);for(v>t&&(UZIP.F.restrictDepth(u,t,v),v=t),c=0;c<l;c++)r[1+(u[c].lit<<1)]=u[c].d;return v},UZIP.F.setDepth=function(e,r){return-1!=e.lit?(e.d=r,r):Math.max(UZIP.F.setDepth(e.l,r+1),UZIP.F.setDepth(e.r,r+1))},UZIP.F.restrictDepth=function(e,r,t){var a=0,i=1<<t-r,s=0;for(e.sort((function(e,r){return r.d==e.d?e.f-r.f:r.d-e.d})),a=0;a<e.length&&e[a].d>r;a++){var c=e[a].d;e[a].d=r,s+=i-(1<<t-c)}for(s>>>=t-r;s>0;){(c=e[a].d)<r?(e[a].d++,s-=1<<r-c-1):a++}for(;a>=0;a--)e[a].d==r&&s<0&&(e[a].d--,s++);0!=s&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,r){var t=0;return r[16|t]<=e&&(t|=16),r[8|t]<=e&&(t|=8),r[4|t]<=e&&(t|=4),r[2|t]<=e&&(t|=2),r[1|t]<=e&&(t|=1),t},UZIP.F._writeLit=function(e,r,t,a){return UZIP.F._putsF(t,a,r[e<<1]),a+r[1+(e<<1)]},UZIP.F.inflate=function(e,r){var t=Uint8Array;if(3==e[0]&&0==e[1])return r||new t(0);var a=UZIP.F,i=a._bitsF,s=a._bitsE,c=a._decodeTiny,l=a.makeCodes,u=a.codes2map,p=a._get17,d=a.U,h=null==r;h&&(r=new t(e.length>>>2<<3));for(var y,A,g=0,v=0,E=0,m=0,I=0,P=0,b=0,T=0,S=0;0==g;)if(g=i(e,S,1),v=i(e,S+1,2),S+=3,0!=v){if(h&&(r=UZIP.F._check(r,T+(1<<17))),1==v&&(y=d.flmap,A=d.fdmap,P=511,b=31),2==v){E=s(e,S,5)+257,m=s(e,S+5,5)+1,I=s(e,S+10,4)+4,S+=14;for(var R=0;R<38;R+=2)d.itree[R]=0,d.itree[R+1]=0;var _=1;for(R=0;R<I;R++){var U=s(e,S+3*R,3);d.itree[1+(d.ordr[R]<<1)]=U,U>_&&(_=U)}S+=3*I,l(d.itree,_),u(d.itree,_,d.imap),y=d.lmap,A=d.dmap,S=c(d.imap,(1<<_)-1,E+m,e,S,d.ttree);var w=a._copyOut(d.ttree,0,E,d.ltree);P=(1<<w)-1;var O=a._copyOut(d.ttree,E,m,d.dtree);b=(1<<O)-1,l(d.ltree,w),u(d.ltree,w,y),l(d.dtree,O),u(d.dtree,O,A)}for(;;){var C=y[p(e,S)&P];S+=15&C;var $=C>>>4;if($>>>8==0)r[T++]=$;else{if(256==$)break;var L=T+$-254;if($>264){var x=d.ldef[$-257];L=T+(x>>>3)+s(e,S,7&x),S+=7&x}var M=A[p(e,S)&b];S+=15&M;var B=M>>>4,D=d.ddef[B],G=(D>>>4)+i(e,S,15&D);for(S+=15&D,h&&(r=UZIP.F._check(r,T+(1<<17)));T<L;)r[T]=r[T++-G],r[T]=r[T++-G],r[T]=r[T++-G],r[T]=r[T++-G];T=L}}}else{0!=(7&S)&&(S+=8-(7&S));var V=4+(S>>>3),k=e[V-4]|e[V-3]<<8;h&&(r=UZIP.F._check(r,T+k)),r.set(new t(e.buffer,e.byteOffset+V,k),T),S=V+k<<3,T+=k}return r.length==T?r:r.slice(0,T)},UZIP.F._check=function(e,r){var t=e.length;if(r<=t)return e;var a=new Uint8Array(Math.max(t<<1,r));return a.set(e,0),a},UZIP.F._decodeTiny=function(e,r,t,a,i,s){for(var c=UZIP.F._bitsE,l=UZIP.F._get17,u=0;u<t;){var p=e[l(a,i)&r];i+=15&p;var d=p>>>4;if(d<=15)s[u]=d,u++;else{var h=0,y=0;16==d?(y=3+c(a,i,2),i+=2,h=s[u-1]):17==d?(y=3+c(a,i,3),i+=3):18==d&&(y=11+c(a,i,7),i+=7);for(var A=u+y;u<A;)s[u]=h,u++}}return i},UZIP.F._copyOut=function(e,r,t,a){for(var i=0,s=0,c=a.length>>>1;s<t;){var l=e[s+r];a[s<<1]=0,a[1+(s<<1)]=l,l>i&&(i=l),s++}for(;s<c;)a[s<<1]=0,a[1+(s<<1)]=0,s++;return i},UZIP.F.makeCodes=function(e,r){for(var t,a,i,s,c=UZIP.F.U,l=e.length,u=c.bl_count,p=0;p<=r;p++)u[p]=0;for(p=1;p<l;p+=2)u[e[p]]++;var d=c.next_code;for(t=0,u[0]=0,a=1;a<=r;a++)t=t+u[a-1]<<1,d[a]=t;for(i=0;i<l;i+=2)0!=(s=e[i+1])&&(e[i]=d[s],d[s]++)},UZIP.F.codes2map=function(e,r,t){for(var a=e.length,i=UZIP.F.U.rev15,s=0;s<a;s+=2)if(0!=e[s+1])for(var c=s>>1,l=e[s+1],u=c<<4|l,p=r-l,d=e[s]<<p,h=d+(1<<p);d!=h;){t[i[d]>>>15-r]=u,d++}},UZIP.F.revCodes=function(e,r){for(var t=UZIP.F.U.rev15,a=15-r,i=0;i<e.length;i+=2){var s=e[i]<<r-e[i+1];e[i]=t[s]>>>a}},UZIP.F._putsE=function(e,r,t){t<<=7&r;var a=r>>>3;e[a]|=t,e[a+1]|=t>>>8},UZIP.F._putsF=function(e,r,t){t<<=7&r;var a=r>>>3;e[a]|=t,e[a+1]|=t>>>8,e[a+2]|=t>>>16},UZIP.F._bitsE=function(e,r,t){return(e[r>>>3]|e[1+(r>>>3)]<<8)>>>(7&r)&(1<<t)-1},UZIP.F._bitsF=function(e,r,t){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16)>>>(7&r)&(1<<t)-1},UZIP.F._get17=function(e,r){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16)>>>(7&r)},UZIP.F._get25=function(e,r){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16|e[3+(r>>>3)]<<24)>>>(7&r)},UZIP.F.U=(r=Uint16Array,t=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new t(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new t(286),dhst:new t(30),ihst:new t(19),lits:new t(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,r=0;r<32768;r++){var t=r;t=(4278255360&(t=(4042322160&(t=(3435973836&(t=(2863311530&t)>>>1|(1431655765&t)<<1))>>>2|(858993459&t)<<2))>>>4|(252645135&t)<<4))>>>8|(16711935&t)<<8,e.rev15[r]=(t>>>16|t<<16)>>>17}function pushV(e,r,t){for(;0!=r--;)e.push(0,t)}for(r=0;r<32;r++)e.ldef[r]=e.of0[r]<<3|e.exb[r],e.ddef[r]=e.df0[r]<<4|e.dxb[r];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()})),UZIP=Object.freeze(_mergeNamespaces({__proto__:null,default:UZIP_1},[UZIP_1])),UPNG={},N,W,H;UPNG.toRGBA8=function(e){var r=e.width,t=e.height;if(null==e.tabs.acTL)return[UPNG.toRGBA8.decodeImage(e.data,r,t,e).buffer];var a=[];null==e.frames[0].data&&(e.frames[0].data=e.data);for(var i=r*t*4,s=new Uint8Array(i),c=new Uint8Array(i),l=new Uint8Array(i),u=0;u<e.frames.length;u++){var p=e.frames[u],d=p.rect.x,h=p.rect.y,y=p.rect.width,A=p.rect.height,g=UPNG.toRGBA8.decodeImage(p.data,y,A,e);if(0!=u)for(var v=0;v<i;v++)l[v]=s[v];if(0==p.blend?UPNG._copyTile(g,y,A,s,r,t,d,h,0):1==p.blend&&UPNG._copyTile(g,y,A,s,r,t,d,h,1),a.push(s.buffer.slice(0)),0==p.dispose);else if(1==p.dispose)UPNG._copyTile(c,y,A,s,r,t,d,h,0);else if(2==p.dispose)for(v=0;v<i;v++)s[v]=l[v]}return a},UPNG.toRGBA8.decodeImage=function(e,r,t,a){var i=r*t,s=UPNG.decode._getBPP(a),c=Math.ceil(r*s/8),l=new Uint8Array(4*i),u=new Uint32Array(l.buffer),p=a.ctype,d=a.depth,h=UPNG._bin.readUshort;if(6==p){var y=i<<2;if(8==d)for(var A=0;A<y;A+=4)l[A]=e[A],l[A+1]=e[A+1],l[A+2]=e[A+2],l[A+3]=e[A+3];if(16==d)for(A=0;A<y;A++)l[A]=e[A<<1]}else if(2==p){var g=a.tabs.tRNS;if(null==g){if(8==d)for(A=0;A<i;A++){var v=3*A;u[A]=255<<24|e[v+2]<<16|e[v+1]<<8|e[v]}if(16==d)for(A=0;A<i;A++){v=6*A;u[A]=255<<24|e[v+4]<<16|e[v+2]<<8|e[v]}}else{var E=g[0],m=g[1],I=g[2];if(8==d)for(A=0;A<i;A++){var P=A<<2;v=3*A;u[A]=255<<24|e[v+2]<<16|e[v+1]<<8|e[v],e[v]==E&&e[v+1]==m&&e[v+2]==I&&(l[P+3]=0)}if(16==d)for(A=0;A<i;A++){P=A<<2,v=6*A;u[A]=255<<24|e[v+4]<<16|e[v+2]<<8|e[v],h(e,v)==E&&h(e,v+2)==m&&h(e,v+4)==I&&(l[P+3]=0)}}}else if(3==p){var b=a.tabs.PLTE,T=a.tabs.tRNS,S=T?T.length:0;if(1==d)for(var R=0;R<t;R++){var _=R*c,U=R*r;for(A=0;A<r;A++){P=U+A<<2;var w=3*(O=e[_+(A>>3)]>>7-((7&A)<<0)&1);l[P]=b[w],l[P+1]=b[w+1],l[P+2]=b[w+2],l[P+3]=O<S?T[O]:255}}if(2==d)for(R=0;R<t;R++)for(_=R*c,U=R*r,A=0;A<r;A++){P=U+A<<2,w=3*(O=e[_+(A>>2)]>>6-((3&A)<<1)&3);l[P]=b[w],l[P+1]=b[w+1],l[P+2]=b[w+2],l[P+3]=O<S?T[O]:255}if(4==d)for(R=0;R<t;R++)for(_=R*c,U=R*r,A=0;A<r;A++){P=U+A<<2,w=3*(O=e[_+(A>>1)]>>4-((1&A)<<2)&15);l[P]=b[w],l[P+1]=b[w+1],l[P+2]=b[w+2],l[P+3]=O<S?T[O]:255}if(8==d)for(A=0;A<i;A++){var O;P=A<<2,w=3*(O=e[A]);l[P]=b[w],l[P+1]=b[w+1],l[P+2]=b[w+2],l[P+3]=O<S?T[O]:255}}else if(4==p){if(8==d)for(A=0;A<i;A++){P=A<<2;var C=e[$=A<<1];l[P]=C,l[P+1]=C,l[P+2]=C,l[P+3]=e[$+1]}if(16==d)for(A=0;A<i;A++){var $;P=A<<2,C=e[$=A<<2];l[P]=C,l[P+1]=C,l[P+2]=C,l[P+3]=e[$+2]}}else if(0==p)for(E=a.tabs.tRNS?a.tabs.tRNS:-1,R=0;R<t;R++){var L=R*c,x=R*r;if(1==d)for(var M=0;M<r;M++){var B=(C=255*(e[L+(M>>>3)]>>>7-(7&M)&1))==255*E?0:255;u[x+M]=B<<24|C<<16|C<<8|C}else if(2==d)for(M=0;M<r;M++){B=(C=85*(e[L+(M>>>2)]>>>6-((3&M)<<1)&3))==85*E?0:255;u[x+M]=B<<24|C<<16|C<<8|C}else if(4==d)for(M=0;M<r;M++){B=(C=17*(e[L+(M>>>1)]>>>4-((1&M)<<2)&15))==17*E?0:255;u[x+M]=B<<24|C<<16|C<<8|C}else if(8==d)for(M=0;M<r;M++){B=(C=e[L+M])==E?0:255;u[x+M]=B<<24|C<<16|C<<8|C}else if(16==d)for(M=0;M<r;M++){C=e[L+(M<<1)],B=h(e,L+(M<<A))==E?0:255;u[x+M]=B<<24|C<<16|C<<8|C}}return l},UPNG.decode=function(e){for(var r,t=new Uint8Array(e),a=8,i=UPNG._bin,s=i.readUshort,c=i.readUint,l={tabs:{},frames:[]},u=new Uint8Array(t.length),p=0,d=0,h=[137,80,78,71,13,10,26,10],y=0;y<8;y++)if(t[y]!=h[y])throw\"The input is not a PNG file!\";for(;a<t.length;){var A=i.readUint(t,a);a+=4;var g=i.readASCII(t,a,4);if(a+=4,\"IHDR\"==g)UPNG.decode._IHDR(t,a,l);else if(\"CgBI\"==g)l.tabs[g]=t.slice(a,a+4);else if(\"IDAT\"==g){for(y=0;y<A;y++)u[p+y]=t[a+y];p+=A}else if(\"acTL\"==g)l.tabs[g]={num_frames:c(t,a),num_plays:c(t,a+4)},r=new Uint8Array(t.length);else if(\"fcTL\"==g){var v;if(0!=d)(v=l.frames[l.frames.length-1]).data=UPNG.decode._decompress(l,r.slice(0,d),v.rect.width,v.rect.height),d=0;var E={x:c(t,a+12),y:c(t,a+16),width:c(t,a+4),height:c(t,a+8)},m=s(t,a+22);m=s(t,a+20)/(0==m?100:m);var I={rect:E,delay:Math.round(1e3*m),dispose:t[a+24],blend:t[a+25]};l.frames.push(I)}else if(\"fdAT\"==g){for(y=0;y<A-4;y++)r[d+y]=t[a+y+4];d+=A-4}else if(\"pHYs\"==g)l.tabs[g]=[i.readUint(t,a),i.readUint(t,a+4),t[a+8]];else if(\"cHRM\"==g){l.tabs[g]=[];for(y=0;y<8;y++)l.tabs[g].push(i.readUint(t,a+4*y))}else if(\"tEXt\"==g||\"zTXt\"==g){null==l.tabs[g]&&(l.tabs[g]={});var P=i.nextZero(t,a),b=i.readASCII(t,a,P-a),T=a+A-P-1;if(\"tEXt\"==g)_=i.readASCII(t,P+1,T);else{var S=UPNG.decode._inflate(t.slice(P+2,P+2+T));_=i.readUTF8(S,0,S.length)}l.tabs[g][b]=_}else if(\"iTXt\"==g){null==l.tabs[g]&&(l.tabs[g]={});P=0;var R=a;P=i.nextZero(t,R);b=i.readASCII(t,R,P-R);var _,U=t[R=P+1];t[R+1],R+=2,P=i.nextZero(t,R),i.readASCII(t,R,P-R),R=P+1,P=i.nextZero(t,R),i.readUTF8(t,R,P-R);T=A-((R=P+1)-a);if(0==U)_=i.readUTF8(t,R,T);else{S=UPNG.decode._inflate(t.slice(R,R+T));_=i.readUTF8(S,0,S.length)}l.tabs[g][b]=_}else if(\"PLTE\"==g)l.tabs[g]=i.readBytes(t,a,A);else if(\"hIST\"==g){var w=l.tabs.PLTE.length/3;l.tabs[g]=[];for(y=0;y<w;y++)l.tabs[g].push(s(t,a+2*y))}else if(\"tRNS\"==g)3==l.ctype?l.tabs[g]=i.readBytes(t,a,A):0==l.ctype?l.tabs[g]=s(t,a):2==l.ctype&&(l.tabs[g]=[s(t,a),s(t,a+2),s(t,a+4)]);else if(\"gAMA\"==g)l.tabs[g]=i.readUint(t,a)/1e5;else if(\"sRGB\"==g)l.tabs[g]=t[a];else if(\"bKGD\"==g)0==l.ctype||4==l.ctype?l.tabs[g]=[s(t,a)]:2==l.ctype||6==l.ctype?l.tabs[g]=[s(t,a),s(t,a+2),s(t,a+4)]:3==l.ctype&&(l.tabs[g]=t[a]);else if(\"IEND\"==g)break;a+=A,i.readUint(t,a),a+=4}0!=d&&((v=l.frames[l.frames.length-1]).data=UPNG.decode._decompress(l,r.slice(0,d),v.rect.width,v.rect.height),d=0);return l.data=UPNG.decode._decompress(l,u,l.width,l.height),delete l.compress,delete l.interlace,delete l.filter,l},UPNG.decode._decompress=function(e,r,t,a){var i=UPNG.decode._getBPP(e),s=Math.ceil(t*i/8),c=new Uint8Array((s+1+e.interlace)*a);return r=e.tabs.CgBI?UPNG.inflateRaw(r,c):UPNG.decode._inflate(r,c),0==e.interlace?r=UPNG.decode._filterZero(r,e,0,t,a):1==e.interlace&&(r=UPNG.decode._readInterlace(r,e)),r},UPNG.decode._inflate=function(e,r){return UPNG.inflateRaw(new Uint8Array(e.buffer,2,e.length-6),r)},UPNG.inflateRaw=(H={},H.H={},H.H.N=function(e,r){var t,a,i=Uint8Array,s=0,c=0,l=0,u=0,p=0,d=0,h=0,y=0,A=0;if(3==e[0]&&0==e[1])return r||new i(0);var g=H.H,v=g.b,E=g.e,m=g.R,I=g.n,P=g.A,b=g.Z,T=g.m,S=null==r;for(S&&(r=new i(e.length>>>2<<5));0==s;)if(s=v(e,A,1),c=v(e,A+1,2),A+=3,0!=c){if(S&&(r=H.H.W(r,y+(1<<17))),1==c&&(t=T.J,a=T.h,d=511,h=31),2==c){l=E(e,A,5)+257,u=E(e,A+5,5)+1,p=E(e,A+10,4)+4,A+=14;for(var R=1,_=0;_<38;_+=2)T.Q[_]=0,T.Q[_+1]=0;for(_=0;_<p;_++){var U=E(e,A+3*_,3);T.Q[1+(T.X[_]<<1)]=U,U>R&&(R=U)}A+=3*p,I(T.Q,R),P(T.Q,R,T.u),t=T.w,a=T.d,A=m(T.u,(1<<R)-1,l+u,e,A,T.v);var w=g.V(T.v,0,l,T.C);d=(1<<w)-1;var O=g.V(T.v,l,u,T.D);h=(1<<O)-1,I(T.C,w),P(T.C,w,t),I(T.D,O),P(T.D,O,a)}for(;;){var C=t[b(e,A)&d];A+=15&C;var $=C>>>4;if($>>>8==0)r[y++]=$;else{if(256==$)break;var L=y+$-254;if($>264){var x=T.q[$-257];L=y+(x>>>3)+E(e,A,7&x),A+=7&x}var M=a[b(e,A)&h];A+=15&M;var B=M>>>4,D=T.c[B],G=(D>>>4)+v(e,A,15&D);for(A+=15&D;y<L;)r[y]=r[y++-G],r[y]=r[y++-G],r[y]=r[y++-G],r[y]=r[y++-G];y=L}}}else{0!=(7&A)&&(A+=8-(7&A));var V=4+(A>>>3),k=e[V-4]|e[V-3]<<8;S&&(r=H.H.W(r,y+k)),r.set(new i(e.buffer,e.byteOffset+V,k),y),A=V+k<<3,y+=k}return r.length==y?r:r.slice(0,y)},H.H.W=function(e,r){var t=e.length;if(r<=t)return e;var a=new Uint8Array(t<<1);return a.set(e,0),a},H.H.R=function(e,r,t,a,i,s){for(var c=H.H.e,l=H.H.Z,u=0;u<t;){var p=e[l(a,i)&r];i+=15&p;var d=p>>>4;if(d<=15)s[u]=d,u++;else{var h=0,y=0;16==d?(y=3+c(a,i,2),i+=2,h=s[u-1]):17==d?(y=3+c(a,i,3),i+=3):18==d&&(y=11+c(a,i,7),i+=7);for(var A=u+y;u<A;)s[u]=h,u++}}return i},H.H.V=function(e,r,t,a){for(var i=0,s=0,c=a.length>>>1;s<t;){var l=e[s+r];a[s<<1]=0,a[1+(s<<1)]=l,l>i&&(i=l),s++}for(;s<c;)a[s<<1]=0,a[1+(s<<1)]=0,s++;return i},H.H.n=function(e,r){for(var t,a,i,s,c=H.H.m,l=e.length,u=c.j,p=0;p<=r;p++)u[p]=0;for(p=1;p<l;p+=2)u[e[p]]++;var d=c.K;for(t=0,u[0]=0,a=1;a<=r;a++)t=t+u[a-1]<<1,d[a]=t;for(i=0;i<l;i+=2)0!=(s=e[i+1])&&(e[i]=d[s],d[s]++)},H.H.A=function(e,r,t){for(var a=e.length,i=H.H.m.r,s=0;s<a;s+=2)if(0!=e[s+1])for(var c=s>>1,l=e[s+1],u=c<<4|l,p=r-l,d=e[s]<<p,h=d+(1<<p);d!=h;)t[i[d]>>>15-r]=u,d++},H.H.l=function(e,r){for(var t=H.H.m.r,a=15-r,i=0;i<e.length;i+=2){var s=e[i]<<r-e[i+1];e[i]=t[s]>>>a}},H.H.M=function(e,r,t){t<<=7&r;var a=r>>>3;e[a]|=t,e[a+1]|=t>>>8},H.H.I=function(e,r,t){t<<=7&r;var a=r>>>3;e[a]|=t,e[a+1]|=t>>>8,e[a+2]|=t>>>16},H.H.e=function(e,r,t){return(e[r>>>3]|e[1+(r>>>3)]<<8)>>>(7&r)&(1<<t)-1},H.H.b=function(e,r,t){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16)>>>(7&r)&(1<<t)-1},H.H.Z=function(e,r){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16)>>>(7&r)},H.H.i=function(e,r){return(e[r>>>3]|e[1+(r>>>3)]<<8|e[2+(r>>>3)]<<16|e[3+(r>>>3)]<<24)>>>(7&r)},H.H.m=(N=Uint16Array,W=Uint32Array,{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new N(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(32768),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(65536),g:new N(32768)}),function(){for(var e=H.H.m,r=0;r<32768;r++){var t=r;t=(4278255360&(t=(4042322160&(t=(3435973836&(t=(2863311530&t)>>>1|(1431655765&t)<<1))>>>2|(858993459&t)<<2))>>>4|(252645135&t)<<4))>>>8|(16711935&t)<<8,e.r[r]=(t>>>16|t<<16)>>>17}function n(e,r,t){for(;0!=r--;)e.push(0,t)}for(r=0;r<32;r++)e.q[r]=e.S[r]<<3|e.T[r],e.c[r]=e.p[r]<<4|e.z[r];n(e._,144,8),n(e._,112,9),n(e._,24,7),n(e._,8,8),H.H.n(e._,9),H.H.A(e._,9,e.J),H.H.l(e._,9),n(e.$,32,5),H.H.n(e.$,5),H.H.A(e.$,5,e.h),H.H.l(e.$,5),n(e.Q,19,0),n(e.C,286,0),n(e.D,30,0),n(e.v,320,0)}(),H.H.N),UPNG.decode._readInterlace=function(e,r){for(var t=r.width,a=r.height,i=UPNG.decode._getBPP(r),s=i>>3,c=Math.ceil(t*i/8),l=new Uint8Array(a*c),u=0,p=[0,0,4,0,2,0,1],d=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],y=[8,8,4,4,2,2,1],A=0;A<7;){for(var g=h[A],v=y[A],E=0,m=0,I=p[A];I<a;)I+=g,m++;for(var P=d[A];P<t;)P+=v,E++;var b=Math.ceil(E*i/8);UPNG.decode._filterZero(e,r,u,E,m);for(var T=0,S=p[A];S<a;){for(var R=d[A],_=u+T*b<<3;R<t;){var U;if(1==i)U=(U=e[_>>3])>>7-(7&_)&1,l[S*c+(R>>3)]|=U<<7-((7&R)<<0);if(2==i)U=(U=e[_>>3])>>6-(7&_)&3,l[S*c+(R>>2)]|=U<<6-((3&R)<<1);if(4==i)U=(U=e[_>>3])>>4-(7&_)&15,l[S*c+(R>>1)]|=U<<4-((1&R)<<2);if(i>=8)for(var w=S*c+R*s,O=0;O<s;O++)l[w+O]=e[(_>>3)+O];_+=i,R+=v}T++,S+=g}E*m!=0&&(u+=m*(1+b)),A+=1}return l},UPNG.decode._getBPP=function(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth},UPNG.decode._filterZero=function(e,r,t,a,i){var s=UPNG.decode._getBPP(r),c=Math.ceil(a*s/8),l=UPNG.decode._paeth;s=Math.ceil(s/8);var u=0,p=1,d=e[t],h=0;if(d>1&&(e[t]=[0,0,1][d-2]),3==d)for(h=s;h<c;h++)e[h+1]=e[h+1]+(e[h+1-s]>>>1)&255;for(var y=0;y<i;y++)if(h=0,0==(d=e[(p=(u=t+y*c)+y+1)-1]))for(;h<c;h++)e[u+h]=e[p+h];else if(1==d){for(;h<s;h++)e[u+h]=e[p+h];for(;h<c;h++)e[u+h]=e[p+h]+e[u+h-s]}else if(2==d)for(;h<c;h++)e[u+h]=e[p+h]+e[u+h-c];else if(3==d){for(;h<s;h++)e[u+h]=e[p+h]+(e[u+h-c]>>>1);for(;h<c;h++)e[u+h]=e[p+h]+(e[u+h-c]+e[u+h-s]>>>1)}else{for(;h<s;h++)e[u+h]=e[p+h]+l(0,e[u+h-c],0);for(;h<c;h++)e[u+h]=e[p+h]+l(e[u+h-s],e[u+h-c],e[u+h-s-c])}return e},UPNG.decode._paeth=function(e,r,t){var a=e+r-t,i=a-e,s=a-r,c=a-t;return i*i<=s*s&&i*i<=c*c?e:s*s<=c*c?r:t},UPNG.decode._IHDR=function(e,r,t){var a=UPNG._bin;t.width=a.readUint(e,r),r+=4,t.height=a.readUint(e,r),r+=4,t.depth=e[r],r++,t.ctype=e[r],r++,t.compress=e[r],r++,t.filter=e[r],r++,t.interlace=e[r],r++},UPNG._bin={nextZero:function nextZero(e,r){for(;0!=e[r];)r++;return r},readUshort:function readUshort(e,r){return e[r]<<8|e[r+1]},writeUshort:function writeUshort(e,r,t){e[r]=t>>8&255,e[r+1]=255&t},readUint:function readUint(e,r){return 16777216*e[r]+(e[r+1]<<16|e[r+2]<<8|e[r+3])},writeUint:function writeUint(e,r,t){e[r]=t>>24&255,e[r+1]=t>>16&255,e[r+2]=t>>8&255,e[r+3]=255&t},readASCII:function readASCII(e,r,t){for(var a=\"\",i=0;i<t;i++)a+=String.fromCharCode(e[r+i]);return a},writeASCII:function writeASCII(e,r,t){for(var a=0;a<t.length;a++)e[r+a]=t.charCodeAt(a)},readBytes:function readBytes(e,r,t){for(var a=[],i=0;i<t;i++)a.push(e[r+i]);return a},pad:function pad(e){return e.length<2?\"0\".concat(e):e},readUTF8:function readUTF8(e,r,t){for(var a,i=\"\",s=0;s<t;s++)i+=\"%\".concat(UPNG._bin.pad(e[r+s].toString(16)));try{a=decodeURIComponent(i)}catch(a){return UPNG._bin.readASCII(e,r,t)}return a}},UPNG._copyTile=function(e,r,t,a,i,s,c,l,u){for(var p=Math.min(r,i),d=Math.min(t,s),h=0,y=0,A=0;A<d;A++)for(var g=0;g<p;g++)if(c>=0&&l>=0?(h=A*r+g<<2,y=(l+A)*i+c+g<<2):(h=(-l+A)*r-c+g<<2,y=A*i+g<<2),0==u)a[y]=e[h],a[y+1]=e[h+1],a[y+2]=e[h+2],a[y+3]=e[h+3];else if(1==u){var v=e[h+3]*(1/255),E=e[h]*v,m=e[h+1]*v,I=e[h+2]*v,P=a[y+3]*(1/255),b=a[y]*P,T=a[y+1]*P,S=a[y+2]*P,R=1-v,_=v+P*R,U=0==_?0:1/_;a[y+3]=255*_,a[y+0]=(E+b*R)*U,a[y+1]=(m+T*R)*U,a[y+2]=(I+S*R)*U}else if(2==u){v=e[h+3],E=e[h],m=e[h+1],I=e[h+2],P=a[y+3],b=a[y],T=a[y+1],S=a[y+2];v==P&&E==b&&m==T&&I==S?(a[y]=0,a[y+1]=0,a[y+2]=0,a[y+3]=0):(a[y]=E,a[y+1]=m,a[y+2]=I,a[y+3]=v)}else if(3==u){v=e[h+3],E=e[h],m=e[h+1],I=e[h+2],P=a[y+3],b=a[y],T=a[y+1],S=a[y+2];if(v==P&&E==b&&m==T&&I==S)continue;if(v<220&&P>20)return!1}return!0},UPNG.encode=function(e,r,t,a,i,s,c){null==a&&(a=0),null==c&&(c=!1);var l=UPNG.encode.compress(e,r,t,a,[!1,!1,!1,0,c]);return UPNG.encode.compressPNG(l,-1),UPNG.encode._main(l,r,t,i,s)},UPNG.encodeLL=function(e,r,t,a,i,s,c,l){for(var u={ctype:0+(1==a?0:2)+(0==i?0:4),depth:s,frames:[]},p=(a+i)*s,d=p*r,h=0;h<e.length;h++)u.frames.push({rect:{x:0,y:0,width:r,height:t},img:new Uint8Array(e[h]),blend:0,dispose:1,bpp:Math.ceil(p/8),bpl:Math.ceil(d/8)});return UPNG.encode.compressPNG(u,0,!0),UPNG.encode._main(u,r,t,c,l)},UPNG.encode._main=function(e,r,t,a,i){null==i&&(i={});var s=UPNG.crc.crc,c=UPNG._bin.writeUint,l=UPNG._bin.writeUshort,u=UPNG._bin.writeASCII,p=8,d=e.frames.length>1,h=!1,y=33+(d?20:0);if(null!=i.sRGB&&(y+=13),null!=i.pHYs&&(y+=21),3==e.ctype){for(var A=e.plte.length,g=0;g<A;g++)e.plte[g]>>>24!=255&&(h=!0);y+=8+3*A+4+(h?8+1*A+4:0)}for(var v=0;v<e.frames.length;v++){d&&(y+=38),y+=(_=e.frames[v]).cimg.length+12,0!=v&&(y+=4)}y+=12;var E=new Uint8Array(y),m=[137,80,78,71,13,10,26,10];for(g=0;g<8;g++)E[g]=m[g];if(c(E,p,13),u(E,p+=4,\"IHDR\"),c(E,p+=4,r),c(E,p+=4,t),E[p+=4]=e.depth,E[++p]=e.ctype,E[++p]=0,E[++p]=0,E[++p]=0,c(E,++p,s(E,p-17,17)),p+=4,null!=i.sRGB&&(c(E,p,1),u(E,p+=4,\"sRGB\"),E[p+=4]=i.sRGB,c(E,++p,s(E,p-5,5)),p+=4),null!=i.pHYs&&(c(E,p,9),u(E,p+=4,\"pHYs\"),c(E,p+=4,i.pHYs[0]),c(E,p+=4,i.pHYs[1]),E[p+=4]=i.pHYs[2],c(E,++p,s(E,p-13,13)),p+=4),d&&(c(E,p,8),u(E,p+=4,\"acTL\"),c(E,p+=4,e.frames.length),c(E,p+=4,null!=i.loop?i.loop:0),c(E,p+=4,s(E,p-12,12)),p+=4),3==e.ctype){c(E,p,3*(A=e.plte.length)),u(E,p+=4,\"PLTE\"),p+=4;for(g=0;g<A;g++){var I=3*g,P=e.plte[g],b=255&P,T=P>>>8&255,S=P>>>16&255;E[p+I+0]=b,E[p+I+1]=T,E[p+I+2]=S}if(c(E,p+=3*A,s(E,p-3*A-4,3*A+4)),p+=4,h){c(E,p,A),u(E,p+=4,\"tRNS\"),p+=4;for(g=0;g<A;g++)E[p+g]=e.plte[g]>>>24&255;c(E,p+=A,s(E,p-A-4,A+4)),p+=4}}var R=0;for(v=0;v<e.frames.length;v++){var _=e.frames[v];d&&(c(E,p,26),u(E,p+=4,\"fcTL\"),c(E,p+=4,R++),c(E,p+=4,_.rect.width),c(E,p+=4,_.rect.height),c(E,p+=4,_.rect.x),c(E,p+=4,_.rect.y),l(E,p+=4,a[v]),l(E,p+=2,1e3),E[p+=2]=_.dispose,E[++p]=_.blend,c(E,++p,s(E,p-30,30)),p+=4);var U=_.cimg;c(E,p,(A=U.length)+(0==v?0:4));var w=p+=4;u(E,p,0==v?\"IDAT\":\"fdAT\"),p+=4,0!=v&&(c(E,p,R++),p+=4),E.set(U,p),c(E,p+=A,s(E,w,p-w)),p+=4}return c(E,p,0),u(E,p+=4,\"IEND\"),c(E,p+=4,s(E,p-4,4)),p+=4,E.buffer},UPNG.encode.compressPNG=function(e,r,t){for(var a=0;a<e.frames.length;a++){var i=e.frames[a];i.rect.width;var s=i.rect.height,c=new Uint8Array(s*i.bpl+s);i.cimg=UPNG.encode._filterZero(i.img,s,i.bpp,i.bpl,c,r,t)}},UPNG.encode.compress=function(e,r,t,a,i){for(var s=i[0],c=i[1],l=i[2],u=i[3],p=i[4],d=6,h=8,y=255,A=0;A<e.length;A++)for(var g=new Uint8Array(e[A]),v=g.length,E=0;E<v;E+=4)y&=g[E+3];var m=255!=y,I=UPNG.encode.framize(e,r,t,s,c,l),P={},b=[],T=[];if(0!=a){var S=[];for(E=0;E<I.length;E++)S.push(I[E].img.buffer);var R=UPNG.encode.concatRGBA(S),_=UPNG.quantize(R,a),U=0,w=new Uint8Array(_.abuf);for(E=0;E<I.length;E++){var O=(J=I[E].img).length;T.push(new Uint8Array(_.inds.buffer,U>>2,O>>2));for(A=0;A<O;A+=4)J[A]=w[U+A],J[A+1]=w[U+A+1],J[A+2]=w[U+A+2],J[A+3]=w[U+A+3];U+=O}for(E=0;E<_.plte.length;E++)b.push(_.plte[E].est.rgba)}else for(A=0;A<I.length;A++){var C=I[A],$=new Uint32Array(C.img.buffer),L=C.rect.width,x=(v=$.length,new Uint8Array(v));T.push(x);for(E=0;E<v;E++){var M=$[E];if(0!=E&&M==$[E-1])x[E]=x[E-1];else if(E>L&&M==$[E-L])x[E]=x[E-L];else{var B=P[M];if(null==B&&(P[M]=B=b.length,b.push(M),b.length>=300))break;x[E]=B}}}var D=b.length;D<=256&&0==p&&(h=D<=2?1:D<=4?2:D<=16?4:8,h=Math.max(h,u));for(A=0;A<I.length;A++){(C=I[A]).rect.x,C.rect.y;L=C.rect.width;var G=C.rect.height,V=C.img;new Uint32Array(V.buffer);var k=4*L,Y=4;if(D<=256&&0==p){k=Math.ceil(h*L/8);for(var q=new Uint8Array(k*G),Z=T[A],Q=0;Q<G;Q++){E=Q*k;var z=Q*L;if(8==h)for(var K=0;K<L;K++)q[E+K]=Z[z+K];else if(4==h)for(K=0;K<L;K++)q[E+(K>>1)]|=Z[z+K]<<4-4*(1&K);else if(2==h)for(K=0;K<L;K++)q[E+(K>>2)]|=Z[z+K]<<6-2*(3&K);else if(1==h)for(K=0;K<L;K++)q[E+(K>>3)]|=Z[z+K]<<7-1*(7&K)}V=q,d=3,Y=1}else if(0==m&&1==I.length){q=new Uint8Array(L*G*3);var X=L*G;for(E=0;E<X;E++){var J,ee=4*E;q[J=3*E]=V[ee],q[J+1]=V[ee+1],q[J+2]=V[ee+2]}V=q,d=2,Y=3,k=3*L}C.img=V,C.bpl=k,C.bpp=Y}return{ctype:d,depth:h,plte:b,frames:I}},UPNG.encode.framize=function(e,r,t,a,i,s){for(var c=[],l=0;l<e.length;l++){var u,p=new Uint8Array(e[l]),d=new Uint32Array(p.buffer),h=0,y=0,A=r,g=t,v=a?1:0;if(0!=l){for(var E=s||a||1==l||0!=c[l-2].dispose?1:2,m=0,I=1e9,P=0;P<E;P++){for(var b=new Uint8Array(e[l-1-P]),T=new Uint32Array(e[l-1-P]),S=r,R=t,_=-1,U=-1,w=0;w<t;w++)for(var O=0;O<r;O++){d[D=w*r+O]!=T[D]&&(O<S&&(S=O),O>_&&(_=O),w<R&&(R=w),w>U&&(U=w))}-1==_&&(S=R=_=U=0),i&&(1==(1&S)&&S--,1==(1&R)&&R--);var C=(_-S+1)*(U-R+1);C<I&&(I=C,m=P,h=S,y=R,A=_-S+1,g=U-R+1)}b=new Uint8Array(e[l-1-m]);1==m&&(c[l-1].dispose=2),u=new Uint8Array(A*g*4),UPNG._copyTile(b,r,t,u,A,g,-h,-y,0),1==(v=UPNG._copyTile(p,r,t,u,A,g,-h,-y,3)?1:0)?UPNG.encode._prepareDiff(p,r,t,u,{x:h,y:y,width:A,height:g}):UPNG._copyTile(p,r,t,u,A,g,-h,-y,0)}else u=p.slice(0);c.push({rect:{x:h,y:y,width:A,height:g},img:u,blend:v,dispose:0})}if(a)for(l=0;l<c.length;l++){if(1!=(G=c[l]).blend){var $=G.rect,L=c[l-1].rect,x=Math.min($.x,L.x),M=Math.min($.y,L.y),B={x:x,y:M,width:Math.max($.x+$.width,L.x+L.width)-x,height:Math.max($.y+$.height,L.y+L.height)-M};c[l-1].dispose=1,l-1!=0&&UPNG.encode._updateFrame(e,r,t,c,l-1,B,i),UPNG.encode._updateFrame(e,r,t,c,l,B,i)}}if(1!=e.length)for(var D=0;D<c.length;D++){var G;(G=c[D]).rect.width*G.rect.height}return c},UPNG.encode._updateFrame=function(e,r,t,a,i,s,c){for(var l=Uint8Array,u=Uint32Array,p=new l(e[i-1]),d=new u(e[i-1]),h=i+1<e.length?new l(e[i+1]):null,y=new l(e[i]),A=new u(y.buffer),g=r,v=t,E=-1,m=-1,I=0;I<s.height;I++)for(var P=0;P<s.width;P++){var b=s.x+P,T=s.y+I,S=T*r+b,R=A[S];0==R||0==a[i-1].dispose&&d[S]==R&&(null==h||0!=h[4*S+3])||(b<g&&(g=b),b>E&&(E=b),T<v&&(v=T),T>m&&(m=T))}-1==E&&(g=v=E=m=0),c&&(1==(1&g)&&g--,1==(1&v)&&v--),s={x:g,y:v,width:E-g+1,height:m-v+1};var _=a[i];_.rect=s,_.blend=1,_.img=new Uint8Array(s.width*s.height*4),0==a[i-1].dispose?(UPNG._copyTile(p,r,t,_.img,s.width,s.height,-s.x,-s.y,0),UPNG.encode._prepareDiff(y,r,t,_.img,s)):UPNG._copyTile(y,r,t,_.img,s.width,s.height,-s.x,-s.y,0)},UPNG.encode._prepareDiff=function(e,r,t,a,i){UPNG._copyTile(e,r,t,a,i.width,i.height,-i.x,-i.y,2)},UPNG.encode._filterZero=function(e,r,t,a,i,s,c){var l,u=[],p=[0,1,2,3,4];-1!=s?p=[s]:(r*a>5e5||1==t)&&(p=[0]),c&&(l={level:0});for(var d,h=UZIP,y=0;y<p.length;y++){for(var A=0;A<r;A++)UPNG.encode._filterLine(i,e,A,a,t,p[y]);u.push(h.deflate(i,l))}var g=1e9;for(y=0;y<u.length;y++)u[y].length<g&&(d=y,g=u[y].length);return u[d]},UPNG.encode._filterLine=function(e,r,t,a,i,s){var c=t*a,l=c+t,u=UPNG.decode._paeth;if(e[l]=s,l++,0==s)if(a<500)for(var p=0;p<a;p++)e[l+p]=r[c+p];else e.set(new Uint8Array(r.buffer,c,a),l);else if(1==s){for(p=0;p<i;p++)e[l+p]=r[c+p];for(p=i;p<a;p++)e[l+p]=r[c+p]-r[c+p-i]+256&255}else if(0==t){for(p=0;p<i;p++)e[l+p]=r[c+p];if(2==s)for(p=i;p<a;p++)e[l+p]=r[c+p];if(3==s)for(p=i;p<a;p++)e[l+p]=r[c+p]-(r[c+p-i]>>1)+256&255;if(4==s)for(p=i;p<a;p++)e[l+p]=r[c+p]-u(r[c+p-i],0,0)+256&255}else{if(2==s)for(p=0;p<a;p++)e[l+p]=r[c+p]+256-r[c+p-a]&255;if(3==s){for(p=0;p<i;p++)e[l+p]=r[c+p]+256-(r[c+p-a]>>1)&255;for(p=i;p<a;p++)e[l+p]=r[c+p]+256-(r[c+p-a]+r[c+p-i]>>1)&255}if(4==s){for(p=0;p<i;p++)e[l+p]=r[c+p]+256-u(0,r[c+p-a],0)&255;for(p=i;p<a;p++)e[l+p]=r[c+p]+256-u(r[c+p-i],r[c+p-a],r[c+p-i-a])&255}}},UPNG.crc={table:function(){for(var e=new Uint32Array(256),r=0;r<256;r++){for(var t=r,a=0;a<8;a++)1&t?t=3988292384^t>>>1:t>>>=1;e[r]=t}return e}(),update:function update(e,r,t,a){for(var i=0;i<a;i++)e=UPNG.crc.table[255&(e^r[t+i])]^e>>>8;return e},crc:function crc(e,r,t){return 4294967295^UPNG.crc.update(4294967295,e,r,t)}},UPNG.quantize=function(e,r){var t,a=new Uint8Array(e),i=a.slice(0),s=new Uint32Array(i.buffer),c=UPNG.quantize.getKDtree(i,r),l=c[0],u=c[1],p=UPNG.quantize.planeDst,d=a,h=s,y=d.length,A=new Uint8Array(a.length>>2);if(a.length<2e7)for(var g=0;g<y;g+=4){var v=d[g]*(1/255),E=d[g+1]*(1/255),m=d[g+2]*(1/255),I=d[g+3]*(1/255);t=UPNG.quantize.getNearest(l,v,E,m,I),A[g>>2]=t.ind,h[g>>2]=t.est.rgba}else for(g=0;g<y;g+=4){v=d[g]*(1/255),E=d[g+1]*(1/255),m=d[g+2]*(1/255),I=d[g+3]*(1/255);for(t=l;t.left;)t=p(t.est,v,E,m,I)<=0?t.left:t.right;A[g>>2]=t.ind,h[g>>2]=t.est.rgba}return{abuf:i.buffer,inds:A,plte:u}},UPNG.quantize.getKDtree=function(e,r,t){null==t&&(t=1e-4);var a=new Uint32Array(e.buffer),i={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};i.bst=UPNG.quantize.stats(e,i.i0,i.i1),i.est=UPNG.quantize.estats(i.bst);for(var s=[i];s.length<r;){for(var c=0,l=0,u=0;u<s.length;u++)s[u].est.L>c&&(c=s[u].est.L,l=u);if(c<t)break;var p=s[l],d=UPNG.quantize.splitPixels(e,a,p.i0,p.i1,p.est.e,p.est.eMq255);if(p.i0>=d||p.i1<=d)p.est.L=0;else{var h={i0:p.i0,i1:d,bst:null,est:null,tdst:0,left:null,right:null};h.bst=UPNG.quantize.stats(e,h.i0,h.i1),h.est=UPNG.quantize.estats(h.bst);var y={i0:d,i1:p.i1,bst:null,est:null,tdst:0,left:null,right:null};y.bst={R:[],m:[],N:p.bst.N-h.bst.N};for(u=0;u<16;u++)y.bst.R[u]=p.bst.R[u]-h.bst.R[u];for(u=0;u<4;u++)y.bst.m[u]=p.bst.m[u]-h.bst.m[u];y.est=UPNG.quantize.estats(y.bst),p.left=h,p.right=y,s[l]=h,s.push(y)}}s.sort((function(e,r){return r.bst.N-e.bst.N}));for(u=0;u<s.length;u++)s[u].ind=u;return[i,s]},UPNG.quantize.getNearest=function(e,r,t,a,i){if(null==e.left)return e.tdst=UPNG.quantize.dist(e.est.q,r,t,a,i),e;var s=UPNG.quantize.planeDst(e.est,r,t,a,i),c=e.left,l=e.right;s>0&&(c=e.right,l=e.left);var u=UPNG.quantize.getNearest(c,r,t,a,i);if(u.tdst<=s*s)return u;var p=UPNG.quantize.getNearest(l,r,t,a,i);return p.tdst<u.tdst?p:u},UPNG.quantize.planeDst=function(e,r,t,a,i){var s=e.e;return s[0]*r+s[1]*t+s[2]*a+s[3]*i-e.eMq},UPNG.quantize.dist=function(e,r,t,a,i){var s=r-e[0],c=t-e[1],l=a-e[2],u=i-e[3];return s*s+c*c+l*l+u*u},UPNG.quantize.splitPixels=function(e,r,t,a,i,s){var c=UPNG.quantize.vecDot;for(a-=4;t<a;){for(;c(e,t,i)<=s;)t+=4;for(;c(e,a,i)>s;)a-=4;if(t>=a)break;var l=r[t>>2];r[t>>2]=r[a>>2],r[a>>2]=l,t+=4,a-=4}for(;c(e,t,i)>s;)t-=4;return t+4},UPNG.quantize.vecDot=function(e,r,t){return e[r]*t[0]+e[r+1]*t[1]+e[r+2]*t[2]+e[r+3]*t[3]},UPNG.quantize.stats=function(e,r,t){for(var a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],i=[0,0,0,0],s=t-r>>2,c=r;c<t;c+=4){var l=e[c]*(1/255),u=e[c+1]*(1/255),p=e[c+2]*(1/255),d=e[c+3]*(1/255);i[0]+=l,i[1]+=u,i[2]+=p,i[3]+=d,a[0]+=l*l,a[1]+=l*u,a[2]+=l*p,a[3]+=l*d,a[5]+=u*u,a[6]+=u*p,a[7]+=u*d,a[10]+=p*p,a[11]+=p*d,a[15]+=d*d}return a[4]=a[1],a[8]=a[2],a[9]=a[6],a[12]=a[3],a[13]=a[7],a[14]=a[11],{R:a,m:i,N:s}},UPNG.quantize.estats=function(e){var r=e.R,t=e.m,a=e.N,i=t[0],s=t[1],c=t[2],l=t[3],u=0==a?0:1/a,p=[r[0]-i*i*u,r[1]-i*s*u,r[2]-i*c*u,r[3]-i*l*u,r[4]-s*i*u,r[5]-s*s*u,r[6]-s*c*u,r[7]-s*l*u,r[8]-c*i*u,r[9]-c*s*u,r[10]-c*c*u,r[11]-c*l*u,r[12]-l*i*u,r[13]-l*s*u,r[14]-l*c*u,r[15]-l*l*u],d=p,h=UPNG.M4,y=[Math.random(),Math.random(),Math.random(),Math.random()],A=0,g=0;if(0!=a)for(var v=0;v<16&&(y=h.multVec(d,y),g=Math.sqrt(h.dot(y,y)),y=h.sml(1/g,y),!(0!=v&&Math.abs(g-A)<1e-9));v++)A=g;var E=[i*u,s*u,c*u,l*u];return{Cov:p,q:E,e:y,L:A,eMq255:h.dot(h.sml(255,E),y),eMq:h.dot(y,E),rgba:(Math.round(255*E[3])<<24|Math.round(255*E[2])<<16|Math.round(255*E[1])<<8|Math.round(255*E[0])<<0)>>>0}},UPNG.M4={multVec:function multVec(e,r){return[e[0]*r[0]+e[1]*r[1]+e[2]*r[2]+e[3]*r[3],e[4]*r[0]+e[5]*r[1]+e[6]*r[2]+e[7]*r[3],e[8]*r[0]+e[9]*r[1]+e[10]*r[2]+e[11]*r[3],e[12]*r[0]+e[13]*r[1]+e[14]*r[2]+e[15]*r[3]]},dot:function dot(e,r){return e[0]*r[0]+e[1]*r[1]+e[2]*r[2]+e[3]*r[3]},sml:function sml(e,r){return[e*r[0],e*r[1],e*r[2],e*r[3]]}},UPNG.encode.concatRGBA=function(e){for(var r=0,t=0;t<e.length;t++)r+=e[t].byteLength;var a=new Uint8Array(r),i=0;for(t=0;t<e.length;t++){for(var s=new Uint8Array(e[t]),c=s.length,l=0;l<c;l+=4){var u=s[l],p=s[l+1],d=s[l+2],h=s[l+3];0==h&&(u=p=d=0),a[i+l]=u,a[i+l+1]=p,a[i+l+2]=d,a[i+l+3]=h}i+=c}return a.buffer};var MaxCanvasSize={chrome:16384,firefox:11180,\"desktop safari\":16384,\"internet explorer\":8192,\"mobile safari\":4096,etc:8192},isBrowser=\"undefined\"!=typeof window,moduleMapper=isBrowser&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=isBrowser&&(moduleMapper&&moduleMapper.getOriginalSymbol(window,\"File\")||void 0!==window.File&&File),CustomFileReader=isBrowser&&(moduleMapper&&moduleMapper.getOriginalSymbol(window,\"FileReader\")||void 0!==window.FileReader&&FileReader);function getFilefromDataUrl(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now();return new Promise((function(a){for(var i=e.split(\",\"),s=i[0].match(/:(.*?);/)[1],c=globalThis.atob(i[1]),l=c.length,u=new Uint8Array(l);l--;)u[l]=c.charCodeAt(l);var p=new Blob([u],{type:s});p.name=r,p.lastModified=t,a(p)}))}function getDataUrlFromFile(e){return new Promise((function(r,t){var a=new CustomFileReader;a.onload=function(){return r(a.result)},a.onerror=function(e){return t(e)},a.readAsDataURL(e)}))}function loadImage(e){return new Promise((function(r,t){var a=new Image;a.onload=function(){return r(a)},a.onerror=function(e){return t(e)},a.src=e}))}function getBrowserName(){var e=\"etc\",r=navigator.userAgent;return/Chrom(e|ium)/i.test(r)?e=\"chrome\":/iP(ad|od|hone)/i.test(r)&&/WebKit/i.test(r)&&!/(CriOS|FxiOS|OPiOS|mercury)/i.test(r)?e=\"mobile safari\":/Safari/i.test(r)?e=\"desktop safari\":/Firefox/i.test(r)?e=\"firefox\":(/MSIE/i.test(r)||!0==!!document.documentMode)&&(e=\"internet explorer\"),e}function approximateBelowMaximumCanvasSizeOfBrowser(e,r){for(var t=getBrowserName(),a=MaxCanvasSize[t],i=e,s=r,c=i*s,l=i>s?s/i:i/s;c>a*a;){var u=(a+i)/2,p=(a+s)/2;u<p?(s=p,i=p*l):(s=u*l,i=u),c=i*s}return{width:i,height:s}}function getNewCanvasAndCtx(e,r){var t,a;try{if(null===(a=(t=new OffscreenCanvas(e,r)).getContext(\"2d\")))throw new Error(\"getContext of OffscreenCanvas returns null\")}catch(e){a=(t=document.createElement(\"canvas\")).getContext(\"2d\")}return t.width=e,t.height=r,[t,a]}function drawImageInCanvas(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,t=approximateBelowMaximumCanvasSizeOfBrowser(e.width,e.height),a=t.width,i=t.height,s=getNewCanvasAndCtx(a,i),c=_slicedToArray(s,2),l=c[0],u=c[1];return r&&/jpe?g/.test(r)&&(u.fillStyle=\"white\",u.fillRect(0,0,l.width,l.height)),u.drawImage(e,0,0,l.width,l.height),l}function isIOS(){return void 0!==isIOS.cachedResult||(isIOS.cachedResult=[\"iPad Simulator\",\"iPhone Simulator\",\"iPod Simulator\",\"iPad\",\"iPhone\",\"iPod\"].includes(navigator.platform)||navigator.userAgent.includes(\"Mac\")&&\"ontouchend\"in document),isIOS.cachedResult}function drawFileInCanvas(e){return new Promise((function(r,t){var a,i,s=function $Try_2_Post(){try{return i=drawImageInCanvas(a,e.type),r([a,i])}catch(e){return t(e)}},c=function $Try_2_Catch(r){try{0;var i=function $Try_3_Catch(e){try{throw e}catch(e){return t(e)}};try{return getDataUrlFromFile(e).then((function(e){try{return loadImage(e).then((function(e){try{return a=e,function $Try_3_Post(){try{return s()}catch(e){return t(e)}}()}catch(e){return i(e)}}),i)}catch(e){return i(e)}}),i)}catch(e){i(e)}}catch(e){return t(e)}};try{if(isIOS())throw new Error(\"Skip createImageBitmap on IOS device\");return createImageBitmap(e).then((function(e){try{return a=e,s()}catch(e){return c()}}),c)}catch(e){c()}}))}function canvasToFile(e,r,t,a){var i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1;return new Promise((function(s,c){var l,u,p;if(\"image/png\"===r)return u=e.getContext(\"2d\").getImageData(0,0,e.width,e.height).data,p=UPNG.encode([u],e.width,e.height,256*i),(l=new Blob([p],{type:r})).name=t,l.lastModified=a,$If_4.call(this);{return\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e.convertToBlob({type:r,quality:i}).then(function(e){try{return(l=e).name=t,l.lastModified=a,$If_5.call(this)}catch(e){return c(e)}}.bind(this),c):getFilefromDataUrl(e.toDataURL(r,i),t,a).then(function(e){try{return l=e,$If_5.call(this)}catch(e){return c(e)}}.bind(this),c);function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,r){var t,a,i,s;return void 0!==isAutoOrientationInBrowser.result?e(isAutoOrientationInBrowser.result):(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(c){try{return drawFileInCanvas(t=c).then((function(c){try{return canvasToFile(a=c[1],t.type,t.name,t.lastModified).then((function(t){try{return i=t,cleanupCanvasMemory(a),drawFileInCanvas(i).then((function(t){try{return s=t[0],isAutoOrientationInBrowser.result=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.result)}catch(e){return r(e)}}),r)}catch(e){return r(e)}}),r)}catch(e){return r(e)}}),r)}catch(e){return r(e)}}),r))}))}function getExifOrientation(e){return new Promise((function(r,t){var a=new CustomFileReader;a.onload=function(e){var t=new DataView(e.target.result);if(65496!=t.getUint16(0,!1))return r(-2);for(var a=t.byteLength,i=2;i<a;){if(t.getUint16(i+2,!1)<=8)return r(-1);var s=t.getUint16(i,!1);if(i+=2,65505==s){if(1165519206!=t.getUint32(i+=2,!1))return r(-1);var c=18761==t.getUint16(i+=6,!1);i+=t.getUint32(i+4,c);var l=t.getUint16(i,c);i+=2;for(var u=0;u<l;u++)if(274==t.getUint16(i+12*u,c))return r(t.getUint16(i+12*u+8,c))}else{if(65280!=(65280&s))break;i+=t.getUint16(i,!1)}}return r(-1)},a.onerror=function(e){return t(e)},a.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,r){var t,a=e.width,i=e.height,s=r.maxWidthOrHeight,c=e;if(isFinite(s)&&(a>s||i>s)){var l=_slicedToArray(getNewCanvasAndCtx(a,i),2);c=l[0],t=l[1],a>i?(c.width=s,c.height=i/a*s):(c.width=a/i*s,c.height=s),t.drawImage(e,0,0,c.width,c.height),cleanupCanvasMemory(e)}return c}function followExifOrientation(e,r){var t=e.width,a=e.height,i=_slicedToArray(getNewCanvasAndCtx(t,a),2),s=i[0],c=i[1];switch(r>4&&r<9?(s.width=a,s.height=t):(s.width=t,s.height=a),r){case 2:c.transform(-1,0,0,1,t,0);break;case 3:c.transform(-1,0,0,-1,t,a);break;case 4:c.transform(1,0,0,-1,0,a);break;case 5:c.transform(0,1,1,0,0,0);break;case 6:c.transform(0,1,-1,0,a,0);break;case 7:c.transform(0,-1,-1,0,a,t);break;case 8:c.transform(0,-1,1,0,0,t)}return c.drawImage(e,0,0,t,a),cleanupCanvasMemory(e),s}function compress(e,r){var t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return new Promise((function(a,i){var s,c,l,u,p,d,h,y,A,g,v,E,m,I,P,b,T,S;function incProgress(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:5;s+=e,r.onProgress(Math.min(s,100))}function setProgress(e){s=Math.min(Math.max(e,s),100),r.onProgress(s)}return s=t,c=r.maxIteration||10,l=1024*r.maxSizeMB*1024,incProgress(),drawFileInCanvas(e).then(function(t){try{var s=_slicedToArray(t,2);return u=s[1],incProgress(),p=handleMaxWidthOrHeight(u,r),incProgress(),new Promise((function(t,a){var i;if(!(i=r.exifOrientation))return getExifOrientation(e).then(function(e){try{return i=e,$If_2.call(this)}catch(e){return a(e)}}.bind(this),a);function $If_2(){return t(i)}return $If_2.call(this)})).then(function(t){try{return d=t,incProgress(),isAutoOrientationInBrowser().then(function(t){try{return h=t?p:followExifOrientation(p,d),incProgress(),y=r.initialQuality||1,A=r.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,y).then(function(r){try{{if(g=r,incProgress(),v=g.size>l,E=g.size>e.size,!v&&!E)return setProgress(100),a(g);var t;function $Loop_3(){if(c--&&(P>l||P>m)){var r,t,a=_slicedToArray(getNewCanvasAndCtx(r=v?.95*S.width:S.width,t=v?.95*S.height:S.height),2);return T=a[0],a[1].drawImage(S,0,0,r,t),y*=.95,canvasToFile(T,A,e.name,e.lastModified,y).then((function(e){try{return b=e,cleanupCanvasMemory(S),S=T,P=b.size,setProgress(Math.min(99,Math.floor((I-P)/(I-l)*100))),$Loop_3}catch(e){return i(e)}}),i)}return[1]}return m=e.size,I=g.size,P=I,S=h,(t=function(e){for(;e;){if(e.then)return void e.then(t,i);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return i(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(S),cleanupCanvasMemory(T),cleanupCanvasMemory(p),cleanupCanvasMemory(h),cleanupCanvasMemory(u),setProgress(100),a(b)}}}catch(e){return i(e)}}.bind(this),i)}catch(e){return i(e)}}.bind(this),i)}catch(e){return i(e)}}.bind(this),i)}catch(e){return i(e)}}.bind(this),i)}))}var charAt=stringMultibyte.charAt,STRING_ITERATOR=\"String Iterator\",setInternalState$2=internalState.set,getInternalState=internalState.getterFor(STRING_ITERATOR);defineIterator(String,\"String\",(function(e){setInternalState$2(this,{type:STRING_ITERATOR,string:toString(e),index:0})}),(function next(){var e,r=getInternalState(this),t=r.string,a=r.index;return a>=t.length?{value:void 0,done:!0}:(e=charAt(t,a),r.index+=e.length,{value:e,done:!1})}));var domIterables={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},classList=documentCreateElement(\"span\").classList,DOMTokenListPrototype=classList&&classList.constructor&&classList.constructor.prototype,domTokenListPrototype=DOMTokenListPrototype===Object.prototype?void 0:DOMTokenListPrototype,ITERATOR$2=wellKnownSymbol(\"iterator\"),TO_STRING_TAG=wellKnownSymbol(\"toStringTag\"),ArrayValues=es_array_iterator.values,handlePrototype$1=function(e,r){if(e){if(e[ITERATOR$2]!==ArrayValues)try{createNonEnumerableProperty(e,ITERATOR$2,ArrayValues)}catch(r){e[ITERATOR$2]=ArrayValues}if(e[TO_STRING_TAG]||createNonEnumerableProperty(e,TO_STRING_TAG,r),domIterables[r])for(var t in es_array_iterator)if(e[t]!==es_array_iterator[t])try{createNonEnumerableProperty(e,t,es_array_iterator[t])}catch(r){e[t]=es_array_iterator[t]}}};for(var COLLECTION_NAME$1 in domIterables)handlePrototype$1(global$1[COLLECTION_NAME$1]&&global$1[COLLECTION_NAME$1].prototype,COLLECTION_NAME$1);handlePrototype$1(domTokenListPrototype,\"DOMTokenList\");var ITERATOR$1=wellKnownSymbol(\"iterator\"),nativeUrl=!fails((function(){var e=new URL(\"b?a=1&b=2&c=3\",\"http://a\"),r=e.searchParams,t=\"\";return e.pathname=\"c%20d\",r.forEach((function(e,a){r.delete(\"b\"),t+=a+e})),isPure&&!e.toJSON||!r.sort||\"http://a/c%20d?a=1&c=3\"!==e.href||\"3\"!==r.get(\"c\")||\"a=1\"!==String(new URLSearchParams(\"?a=1\"))||!r[ITERATOR$1]||\"a\"!==new URL(\"https://a@b\").username||\"b\"!==new URLSearchParams(new URLSearchParams(\"a=b\")).get(\"a\")||\"xn--e1aybc\"!==new URL(\"http://тест\").host||\"#%D0%B1\"!==new URL(\"http://a#б\").hash||\"a1c3\"!==t||\"x\"!==new URL(\"http://x\",void 0).host})),callWithSafeIterationClosing=function(e,r,t,a){try{return a?r(anObject(t)[0],t[1]):r(t)}catch(r){iteratorClose(e,\"throw\",r)}},arrayFrom=function from(e){var r=toObject(e),t=isConstructor(this),a=arguments.length,i=a>1?arguments[1]:void 0,s=void 0!==i;s&&(i=functionBindContext(i,a>2?arguments[2]:void 0,2));var c,l,u,p,d,h,y=getIteratorMethod(r),A=0;if(!y||this==Array&&isArrayIteratorMethod(y))for(c=toLength(r.length),l=t?new this(c):Array(c);c>A;A++)h=s?i(r[A],A):r[A],createProperty(l,A,h);else for(d=(p=getIterator(r,y)).next,l=t?new this:[];!(u=d.call(p)).done;A++)h=s?callWithSafeIterationClosing(p,i,[u.value,A],!0):u.value,createProperty(l,A,h);return l.length=A,l},maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter=\"-\",regexNonASCII=/[^\\0-\\u007E]/,regexSeparators=/[.\\u3002\\uFF0E\\uFF61]/g,OVERFLOW_ERROR=\"Overflow: input needs wider integers to process\",baseMinusTMin=base-tMin,floor$2=Math.floor,stringFromCharCode=String.fromCharCode,ucs2decode=function(e){for(var r=[],t=0,a=e.length;t<a;){var i=e.charCodeAt(t++);if(i>=55296&&i<=56319&&t<a){var s=e.charCodeAt(t++);56320==(64512&s)?r.push(((1023&i)<<10)+(1023&s)+65536):(r.push(i),t--)}else r.push(i)}return r},digitToBasic=function(e){return e+22+75*(e<26)},adapt=function(e,r,t){var a=0;for(e=t?floor$2(e/damp):e>>1,e+=floor$2(e/r);e>baseMinusTMin*tMax>>1;a+=base)e=floor$2(e/baseMinusTMin);return floor$2(a+(baseMinusTMin+1)*e/(e+skew))},encode=function(e){var r,t,a=[],i=(e=ucs2decode(e)).length,s=initialN,c=0,l=initialBias;for(r=0;r<e.length;r++)(t=e[r])<128&&a.push(stringFromCharCode(t));var u=a.length,p=u;for(u&&a.push(delimiter);p<i;){var d=maxInt;for(r=0;r<e.length;r++)(t=e[r])>=s&&t<d&&(d=t);var h=p+1;if(d-s>floor$2((maxInt-c)/h))throw RangeError(OVERFLOW_ERROR);for(c+=(d-s)*h,s=d,r=0;r<e.length;r++){if((t=e[r])<s&&++c>maxInt)throw RangeError(OVERFLOW_ERROR);if(t==s){for(var y=c,A=base;;A+=base){var g=A<=l?tMin:A>=l+tMax?tMax:A-l;if(y<g)break;var v=y-g,E=base-g;a.push(stringFromCharCode(digitToBasic(g+v%E))),y=floor$2(v/E)}a.push(stringFromCharCode(digitToBasic(y))),l=adapt(c,h,p==u),c=0,++p}}++c,++s}return a.join(\"\")},stringPunycodeToAscii=function(e){var r,t,a=[],i=e.toLowerCase().replace(regexSeparators,\".\").split(\".\");for(r=0;r<i.length;r++)t=i[r],a.push(regexNonASCII.test(t)?\"xn--\"+encode(t):t);return a.join(\".\")},nativeFetch=getBuiltIn(\"fetch\"),NativeRequest=getBuiltIn(\"Request\"),RequestPrototype=NativeRequest&&NativeRequest.prototype,Headers=getBuiltIn(\"Headers\"),ITERATOR=wellKnownSymbol(\"iterator\"),URL_SEARCH_PARAMS=\"URLSearchParams\",URL_SEARCH_PARAMS_ITERATOR=URL_SEARCH_PARAMS+\"Iterator\",setInternalState$1=internalState.set,getInternalParamsState=internalState.getterFor(URL_SEARCH_PARAMS),getInternalIteratorState=internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR),plus=/\\+/g,sequences=Array(4),percentSequence=function(e){return sequences[e-1]||(sequences[e-1]=RegExp(\"((?:%[\\\\da-f]{2}){\"+e+\"})\",\"gi\"))},percentDecode=function(e){try{return decodeURIComponent(e)}catch(r){return e}},deserialize=function(e){var r=e.replace(plus,\" \"),t=4;try{return decodeURIComponent(r)}catch(e){for(;t;)r=r.replace(percentSequence(t--),percentDecode);return r}},find=/[!'()~]|%20/g,replace$1={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\"},replacer=function(e){return replace$1[e]},serialize=function(e){return encodeURIComponent(e).replace(find,replacer)},parseSearchParams=function(e,r){if(r)for(var t,a,i=r.split(\"&\"),s=0;s<i.length;)(t=i[s++]).length&&(a=t.split(\"=\"),e.push({key:deserialize(a.shift()),value:deserialize(a.join(\"=\"))}))},updateSearchParams=function(e){this.entries.length=0,parseSearchParams(this.entries,e)},validateArgumentsLength=function(e,r){if(e<r)throw TypeError(\"Not enough arguments\")},URLSearchParamsIterator=createIteratorConstructor((function Iterator(e,r){setInternalState$1(this,{type:URL_SEARCH_PARAMS_ITERATOR,iterator:getIterator(getInternalParamsState(e).entries),kind:r})}),\"Iterator\",(function next(){var e=getInternalIteratorState(this),r=e.kind,t=e.iterator.next(),a=t.value;return t.done||(t.value=\"keys\"===r?a.key:\"values\"===r?a.value:[a.key,a.value]),t})),URLSearchParamsConstructor=function URLSearchParams(){anInstance(this,URLSearchParamsConstructor,URL_SEARCH_PARAMS);var e,r,t,a,i,s,c,l,u,p=arguments.length>0?arguments[0]:void 0,d=this,h=[];if(setInternalState$1(d,{type:URL_SEARCH_PARAMS,entries:h,updateURL:function(){},updateSearchParams:updateSearchParams}),void 0!==p)if(isObject(p))if(e=getIteratorMethod(p))for(t=(r=getIterator(p,e)).next;!(a=t.call(r)).done;){if((c=(s=(i=getIterator(anObject(a.value))).next).call(i)).done||(l=s.call(i)).done||!s.call(i).done)throw TypeError(\"Expected sequence with length 2\");h.push({key:toString(c.value),value:toString(l.value)})}else for(u in p)has$1(p,u)&&h.push({key:u,value:toString(p[u])});else parseSearchParams(h,\"string\"==typeof p?\"?\"===p.charAt(0)?p.slice(1):p:toString(p))},URLSearchParamsPrototype=URLSearchParamsConstructor.prototype;if(redefineAll(URLSearchParamsPrototype,{append:function append(e,r){validateArgumentsLength(arguments.length,2);var t=getInternalParamsState(this);t.entries.push({key:toString(e),value:toString(r)}),t.updateURL()},delete:function(e){validateArgumentsLength(arguments.length,1);for(var r=getInternalParamsState(this),t=r.entries,a=toString(e),i=0;i<t.length;)t[i].key===a?t.splice(i,1):i++;r.updateURL()},get:function get(e){validateArgumentsLength(arguments.length,1);for(var r=getInternalParamsState(this).entries,t=toString(e),a=0;a<r.length;a++)if(r[a].key===t)return r[a].value;return null},getAll:function getAll(e){validateArgumentsLength(arguments.length,1);for(var r=getInternalParamsState(this).entries,t=toString(e),a=[],i=0;i<r.length;i++)r[i].key===t&&a.push(r[i].value);return a},has:function has(e){validateArgumentsLength(arguments.length,1);for(var r=getInternalParamsState(this).entries,t=toString(e),a=0;a<r.length;)if(r[a++].key===t)return!0;return!1},set:function set(e,r){validateArgumentsLength(arguments.length,1);for(var t,a=getInternalParamsState(this),i=a.entries,s=!1,c=toString(e),l=toString(r),u=0;u<i.length;u++)(t=i[u]).key===c&&(s?i.splice(u--,1):(s=!0,t.value=l));s||i.push({key:c,value:l}),a.updateURL()},sort:function sort(){var e,r,t,a=getInternalParamsState(this),i=a.entries,s=i.slice();for(i.length=0,t=0;t<s.length;t++){for(e=s[t],r=0;r<t;r++)if(i[r].key>e.key){i.splice(r,0,e);break}r===t&&i.push(e)}a.updateURL()},forEach:function forEach(e){for(var r,t=getInternalParamsState(this).entries,a=functionBindContext(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<t.length;)a((r=t[i++]).value,r.key,this)},keys:function keys(){return new URLSearchParamsIterator(this,\"keys\")},values:function values(){return new URLSearchParamsIterator(this,\"values\")},entries:function entries(){return new URLSearchParamsIterator(this,\"entries\")}},{enumerable:!0}),redefine(URLSearchParamsPrototype,ITERATOR,URLSearchParamsPrototype.entries,{name:\"entries\"}),redefine(URLSearchParamsPrototype,\"toString\",(function toString(){for(var e,r=getInternalParamsState(this).entries,t=[],a=0;a<r.length;)e=r[a++],t.push(serialize(e.key)+\"=\"+serialize(e.value));return t.join(\"&\")}),{enumerable:!0}),setToStringTag(URLSearchParamsConstructor,URL_SEARCH_PARAMS),_export({global:!0,forced:!nativeUrl},{URLSearchParams:URLSearchParamsConstructor}),!nativeUrl&&isCallable(Headers)){var wrapRequestOptions=function(e){if(isObject(e)){var r,t=e.body;if(classof(t)===URL_SEARCH_PARAMS)return(r=e.headers?new Headers(e.headers):new Headers).has(\"content-type\")||r.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"),objectCreate(e,{body:createPropertyDescriptor(0,String(t)),headers:createPropertyDescriptor(0,r)})}return e};if(isCallable(nativeFetch)&&_export({global:!0,enumerable:!0,forced:!0},{fetch:function fetch(e){return nativeFetch(e,arguments.length>1?wrapRequestOptions(arguments[1]):{})}}),isCallable(NativeRequest)){var RequestConstructor=function Request(e){return anInstance(this,RequestConstructor,\"Request\"),new NativeRequest(e,arguments.length>1?wrapRequestOptions(arguments[1]):{})};RequestPrototype.constructor=RequestConstructor,RequestConstructor.prototype=RequestPrototype,_export({global:!0,forced:!0},{Request:RequestConstructor})}}var web_urlSearchParams={URLSearchParams:URLSearchParamsConstructor,getState:getInternalParamsState},codeAt=stringMultibyte.codeAt,NativeURL=global$1.URL,URLSearchParams$1=web_urlSearchParams.URLSearchParams,getInternalSearchParamsState=web_urlSearchParams.getState,setInternalState=internalState.set,getInternalURLState=internalState.getterFor(\"URL\"),floor$1=Math.floor,pow=Math.pow,INVALID_AUTHORITY=\"Invalid authority\",INVALID_SCHEME=\"Invalid scheme\",INVALID_HOST=\"Invalid host\",INVALID_PORT=\"Invalid port\",ALPHA=/[A-Za-z]/,ALPHANUMERIC=/[\\d+-.A-Za-z]/,DIGIT=/\\d/,HEX_START=/^0x/i,OCT=/^[0-7]+$/,DEC=/^\\d+$/,HEX=/^[\\dA-Fa-f]+$/,FORBIDDEN_HOST_CODE_POINT=/[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/,FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT=/[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/,LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE=/^[\\u0000-\\u0020]+|[\\u0000-\\u0020]+$/g,TAB_AND_NEW_LINE=/[\\t\\n\\r]/g,EOF,parseHost=function(e,r){var t,a,i;if(\"[\"==r.charAt(0)){if(\"]\"!=r.charAt(r.length-1))return INVALID_HOST;if(!(t=parseIPv6(r.slice(1,-1))))return INVALID_HOST;e.host=t}else if(isSpecial(e)){if(r=stringPunycodeToAscii(r),FORBIDDEN_HOST_CODE_POINT.test(r))return INVALID_HOST;if(null===(t=parseIPv4(r)))return INVALID_HOST;e.host=t}else{if(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(r))return INVALID_HOST;for(t=\"\",a=arrayFrom(r),i=0;i<a.length;i++)t+=percentEncode(a[i],C0ControlPercentEncodeSet);e.host=t}},parseIPv4=function(e){var r,t,a,i,s,c,l,u=e.split(\".\");if(u.length&&\"\"==u[u.length-1]&&u.pop(),(r=u.length)>4)return e;for(t=[],a=0;a<r;a++){if(\"\"==(i=u[a]))return e;if(s=10,i.length>1&&\"0\"==i.charAt(0)&&(s=HEX_START.test(i)?16:8,i=i.slice(8==s?1:2)),\"\"===i)c=0;else{if(!(10==s?DEC:8==s?OCT:HEX).test(i))return e;c=parseInt(i,s)}t.push(c)}for(a=0;a<r;a++)if(c=t[a],a==r-1){if(c>=pow(256,5-r))return null}else if(c>255)return null;for(l=t.pop(),a=0;a<t.length;a++)l+=t[a]*pow(256,3-a);return l},parseIPv6=function(e){var r,t,a,i,s,c,l,u=[0,0,0,0,0,0,0,0],p=0,d=null,h=0,chr=function(){return e.charAt(h)};if(\":\"==chr()){if(\":\"!=e.charAt(1))return;h+=2,d=++p}for(;chr();){if(8==p)return;if(\":\"!=chr()){for(r=t=0;t<4&&HEX.test(chr());)r=16*r+parseInt(chr(),16),h++,t++;if(\".\"==chr()){if(0==t)return;if(h-=t,p>6)return;for(a=0;chr();){if(i=null,a>0){if(!(\".\"==chr()&&a<4))return;h++}if(!DIGIT.test(chr()))return;for(;DIGIT.test(chr());){if(s=parseInt(chr(),10),null===i)i=s;else{if(0==i)return;i=10*i+s}if(i>255)return;h++}u[p]=256*u[p]+i,2!=++a&&4!=a||p++}if(4!=a)return;break}if(\":\"==chr()){if(h++,!chr())return}else if(chr())return;u[p++]=r}else{if(null!==d)return;h++,d=++p}}if(null!==d)for(c=p-d,p=7;0!=p&&c>0;)l=u[p],u[p--]=u[d+c-1],u[d+--c]=l;else if(8!=p)return;return u},findLongestZeroSequence=function(e){for(var r=null,t=1,a=null,i=0,s=0;s<8;s++)0!==e[s]?(i>t&&(r=a,t=i),a=null,i=0):(null===a&&(a=s),++i);return i>t&&(r=a,t=i),r},serializeHost=function(e){var r,t,a,i;if(\"number\"==typeof e){for(r=[],t=0;t<4;t++)r.unshift(e%256),e=floor$1(e/256);return r.join(\".\")}if(\"object\"==typeof e){for(r=\"\",a=findLongestZeroSequence(e),t=0;t<8;t++)i&&0===e[t]||(i&&(i=!1),a===t?(r+=t?\":\":\"::\",i=!0):(r+=e[t].toString(16),t<7&&(r+=\":\")));return\"[\"+r+\"]\"}return e},C0ControlPercentEncodeSet={},fragmentPercentEncodeSet=objectAssign({},C0ControlPercentEncodeSet,{\" \":1,'\"':1,\"<\":1,\">\":1,\"`\":1}),pathPercentEncodeSet=objectAssign({},fragmentPercentEncodeSet,{\"#\":1,\"?\":1,\"{\":1,\"}\":1}),userinfoPercentEncodeSet=objectAssign({},pathPercentEncodeSet,{\"/\":1,\":\":1,\";\":1,\"=\":1,\"@\":1,\"[\":1,\"\\\\\":1,\"]\":1,\"^\":1,\"|\":1}),percentEncode=function(e,r){var t=codeAt(e,0);return t>32&&t<127&&!has$1(r,e)?e:encodeURIComponent(e)},specialSchemes={ftp:21,file:null,http:80,https:443,ws:80,wss:443},isSpecial=function(e){return has$1(specialSchemes,e.scheme)},includesCredentials=function(e){return\"\"!=e.username||\"\"!=e.password},cannotHaveUsernamePasswordPort=function(e){return!e.host||e.cannotBeABaseURL||\"file\"==e.scheme},isWindowsDriveLetter=function(e,r){var t;return 2==e.length&&ALPHA.test(e.charAt(0))&&(\":\"==(t=e.charAt(1))||!r&&\"|\"==t)},startsWithWindowsDriveLetter=function(e){var r;return e.length>1&&isWindowsDriveLetter(e.slice(0,2))&&(2==e.length||\"/\"===(r=e.charAt(2))||\"\\\\\"===r||\"?\"===r||\"#\"===r)},shortenURLsPath=function(e){var r=e.path,t=r.length;!t||\"file\"==e.scheme&&1==t&&isWindowsDriveLetter(r[0],!0)||r.pop()},isSingleDot=function(e){return\".\"===e||\"%2e\"===e.toLowerCase()},isDoubleDot=function(e){return\"..\"===(e=e.toLowerCase())||\"%2e.\"===e||\".%2e\"===e||\"%2e%2e\"===e},SCHEME_START={},SCHEME={},NO_SCHEME={},SPECIAL_RELATIVE_OR_AUTHORITY={},PATH_OR_AUTHORITY={},RELATIVE={},RELATIVE_SLASH={},SPECIAL_AUTHORITY_SLASHES={},SPECIAL_AUTHORITY_IGNORE_SLASHES={},AUTHORITY={},HOST={},HOSTNAME={},PORT={},FILE={},FILE_SLASH={},FILE_HOST={},PATH_START={},PATH={},CANNOT_BE_A_BASE_URL_PATH={},QUERY={},FRAGMENT={},parseURL=function(e,r,t,a){var i,s,c,l,u=t||SCHEME_START,p=0,d=\"\",h=!1,y=!1,A=!1;for(t||(e.scheme=\"\",e.username=\"\",e.password=\"\",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,r=r.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE,\"\")),r=r.replace(TAB_AND_NEW_LINE,\"\"),i=arrayFrom(r);p<=i.length;){switch(s=i[p],u){case SCHEME_START:if(!s||!ALPHA.test(s)){if(t)return INVALID_SCHEME;u=NO_SCHEME;continue}d+=s.toLowerCase(),u=SCHEME;break;case SCHEME:if(s&&(ALPHANUMERIC.test(s)||\"+\"==s||\"-\"==s||\".\"==s))d+=s.toLowerCase();else{if(\":\"!=s){if(t)return INVALID_SCHEME;d=\"\",u=NO_SCHEME,p=0;continue}if(t&&(isSpecial(e)!=has$1(specialSchemes,d)||\"file\"==d&&(includesCredentials(e)||null!==e.port)||\"file\"==e.scheme&&!e.host))return;if(e.scheme=d,t)return void(isSpecial(e)&&specialSchemes[e.scheme]==e.port&&(e.port=null));d=\"\",\"file\"==e.scheme?u=FILE:isSpecial(e)&&a&&a.scheme==e.scheme?u=SPECIAL_RELATIVE_OR_AUTHORITY:isSpecial(e)?u=SPECIAL_AUTHORITY_SLASHES:\"/\"==i[p+1]?(u=PATH_OR_AUTHORITY,p++):(e.cannotBeABaseURL=!0,e.path.push(\"\"),u=CANNOT_BE_A_BASE_URL_PATH)}break;case NO_SCHEME:if(!a||a.cannotBeABaseURL&&\"#\"!=s)return INVALID_SCHEME;if(a.cannotBeABaseURL&&\"#\"==s){e.scheme=a.scheme,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",e.cannotBeABaseURL=!0,u=FRAGMENT;break}u=\"file\"==a.scheme?FILE:RELATIVE;continue;case SPECIAL_RELATIVE_OR_AUTHORITY:if(\"/\"!=s||\"/\"!=i[p+1]){u=RELATIVE;continue}u=SPECIAL_AUTHORITY_IGNORE_SLASHES,p++;break;case PATH_OR_AUTHORITY:if(\"/\"==s){u=AUTHORITY;break}u=PATH;continue;case RELATIVE:if(e.scheme=a.scheme,s==EOF)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query;else if(\"/\"==s||\"\\\\\"==s&&isSpecial(e))u=RELATIVE_SLASH;else if(\"?\"==s)e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=\"\",u=QUERY;else{if(\"#\"!=s){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.path.pop(),u=PATH;continue}e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",u=FRAGMENT}break;case RELATIVE_SLASH:if(!isSpecial(e)||\"/\"!=s&&\"\\\\\"!=s){if(\"/\"!=s){e.username=a.username,e.password=a.password,e.host=a.host,e.port=a.port,u=PATH;continue}u=AUTHORITY}else u=SPECIAL_AUTHORITY_IGNORE_SLASHES;break;case SPECIAL_AUTHORITY_SLASHES:if(u=SPECIAL_AUTHORITY_IGNORE_SLASHES,\"/\"!=s||\"/\"!=d.charAt(p+1))continue;p++;break;case SPECIAL_AUTHORITY_IGNORE_SLASHES:if(\"/\"!=s&&\"\\\\\"!=s){u=AUTHORITY;continue}break;case AUTHORITY:if(\"@\"==s){h&&(d=\"%40\"+d),h=!0,c=arrayFrom(d);for(var g=0;g<c.length;g++){var v=c[g];if(\":\"!=v||A){var E=percentEncode(v,userinfoPercentEncodeSet);A?e.password+=E:e.username+=E}else A=!0}d=\"\"}else if(s==EOF||\"/\"==s||\"?\"==s||\"#\"==s||\"\\\\\"==s&&isSpecial(e)){if(h&&\"\"==d)return INVALID_AUTHORITY;p-=arrayFrom(d).length+1,d=\"\",u=HOST}else d+=s;break;case HOST:case HOSTNAME:if(t&&\"file\"==e.scheme){u=FILE_HOST;continue}if(\":\"!=s||y){if(s==EOF||\"/\"==s||\"?\"==s||\"#\"==s||\"\\\\\"==s&&isSpecial(e)){if(isSpecial(e)&&\"\"==d)return INVALID_HOST;if(t&&\"\"==d&&(includesCredentials(e)||null!==e.port))return;if(l=parseHost(e,d))return l;if(d=\"\",u=PATH_START,t)return;continue}\"[\"==s?y=!0:\"]\"==s&&(y=!1),d+=s}else{if(\"\"==d)return INVALID_HOST;if(l=parseHost(e,d))return l;if(d=\"\",u=PORT,t==HOSTNAME)return}break;case PORT:if(!DIGIT.test(s)){if(s==EOF||\"/\"==s||\"?\"==s||\"#\"==s||\"\\\\\"==s&&isSpecial(e)||t){if(\"\"!=d){var m=parseInt(d,10);if(m>65535)return INVALID_PORT;e.port=isSpecial(e)&&m===specialSchemes[e.scheme]?null:m,d=\"\"}if(t)return;u=PATH_START;continue}return INVALID_PORT}d+=s;break;case FILE:if(e.scheme=\"file\",\"/\"==s||\"\\\\\"==s)u=FILE_SLASH;else{if(!a||\"file\"!=a.scheme){u=PATH;continue}if(s==EOF)e.host=a.host,e.path=a.path.slice(),e.query=a.query;else if(\"?\"==s)e.host=a.host,e.path=a.path.slice(),e.query=\"\",u=QUERY;else{if(\"#\"!=s){startsWithWindowsDriveLetter(i.slice(p).join(\"\"))||(e.host=a.host,e.path=a.path.slice(),shortenURLsPath(e)),u=PATH;continue}e.host=a.host,e.path=a.path.slice(),e.query=a.query,e.fragment=\"\",u=FRAGMENT}}break;case FILE_SLASH:if(\"/\"==s||\"\\\\\"==s){u=FILE_HOST;break}a&&\"file\"==a.scheme&&!startsWithWindowsDriveLetter(i.slice(p).join(\"\"))&&(isWindowsDriveLetter(a.path[0],!0)?e.path.push(a.path[0]):e.host=a.host),u=PATH;continue;case FILE_HOST:if(s==EOF||\"/\"==s||\"\\\\\"==s||\"?\"==s||\"#\"==s){if(!t&&isWindowsDriveLetter(d))u=PATH;else if(\"\"==d){if(e.host=\"\",t)return;u=PATH_START}else{if(l=parseHost(e,d))return l;if(\"localhost\"==e.host&&(e.host=\"\"),t)return;d=\"\",u=PATH_START}continue}d+=s;break;case PATH_START:if(isSpecial(e)){if(u=PATH,\"/\"!=s&&\"\\\\\"!=s)continue}else if(t||\"?\"!=s)if(t||\"#\"!=s){if(s!=EOF&&(u=PATH,\"/\"!=s))continue}else e.fragment=\"\",u=FRAGMENT;else e.query=\"\",u=QUERY;break;case PATH:if(s==EOF||\"/\"==s||\"\\\\\"==s&&isSpecial(e)||!t&&(\"?\"==s||\"#\"==s)){if(isDoubleDot(d)?(shortenURLsPath(e),\"/\"==s||\"\\\\\"==s&&isSpecial(e)||e.path.push(\"\")):isSingleDot(d)?\"/\"==s||\"\\\\\"==s&&isSpecial(e)||e.path.push(\"\"):(\"file\"==e.scheme&&!e.path.length&&isWindowsDriveLetter(d)&&(e.host&&(e.host=\"\"),d=d.charAt(0)+\":\"),e.path.push(d)),d=\"\",\"file\"==e.scheme&&(s==EOF||\"?\"==s||\"#\"==s))for(;e.path.length>1&&\"\"===e.path[0];)e.path.shift();\"?\"==s?(e.query=\"\",u=QUERY):\"#\"==s&&(e.fragment=\"\",u=FRAGMENT)}else d+=percentEncode(s,pathPercentEncodeSet);break;case CANNOT_BE_A_BASE_URL_PATH:\"?\"==s?(e.query=\"\",u=QUERY):\"#\"==s?(e.fragment=\"\",u=FRAGMENT):s!=EOF&&(e.path[0]+=percentEncode(s,C0ControlPercentEncodeSet));break;case QUERY:t||\"#\"!=s?s!=EOF&&(\"'\"==s&&isSpecial(e)?e.query+=\"%27\":e.query+=\"#\"==s?\"%23\":percentEncode(s,C0ControlPercentEncodeSet)):(e.fragment=\"\",u=FRAGMENT);break;case FRAGMENT:s!=EOF&&(e.fragment+=percentEncode(s,fragmentPercentEncodeSet))}p++}},URLConstructor=function URL(e){var r,t,a=anInstance(this,URLConstructor,\"URL\"),i=arguments.length>1?arguments[1]:void 0,s=toString(e),c=setInternalState(a,{type:\"URL\"});if(void 0!==i)if(i instanceof URLConstructor)r=getInternalURLState(i);else if(t=parseURL(r={},toString(i)))throw TypeError(t);if(t=parseURL(c,s,null,r))throw TypeError(t);var l=c.searchParams=new URLSearchParams$1,u=getInternalSearchParamsState(l);u.updateSearchParams(c.query),u.updateURL=function(){c.query=String(l)||null},descriptors||(a.href=serializeURL.call(a),a.origin=getOrigin.call(a),a.protocol=getProtocol.call(a),a.username=getUsername.call(a),a.password=getPassword.call(a),a.host=getHost.call(a),a.hostname=getHostname.call(a),a.port=getPort.call(a),a.pathname=getPathname.call(a),a.search=getSearch.call(a),a.searchParams=getSearchParams.call(a),a.hash=getHash.call(a))},URLPrototype=URLConstructor.prototype,serializeURL=function(){var e=getInternalURLState(this),r=e.scheme,t=e.username,a=e.password,i=e.host,s=e.port,c=e.path,l=e.query,u=e.fragment,p=r+\":\";return null!==i?(p+=\"//\",includesCredentials(e)&&(p+=t+(a?\":\"+a:\"\")+\"@\"),p+=serializeHost(i),null!==s&&(p+=\":\"+s)):\"file\"==r&&(p+=\"//\"),p+=e.cannotBeABaseURL?c[0]:c.length?\"/\"+c.join(\"/\"):\"\",null!==l&&(p+=\"?\"+l),null!==u&&(p+=\"#\"+u),p},getOrigin=function(){var e=getInternalURLState(this),r=e.scheme,t=e.port;if(\"blob\"==r)try{return new URLConstructor(r.path[0]).origin}catch(e){return\"null\"}return\"file\"!=r&&isSpecial(e)?r+\"://\"+serializeHost(e.host)+(null!==t?\":\"+t:\"\"):\"null\"},getProtocol=function(){return getInternalURLState(this).scheme+\":\"},getUsername=function(){return getInternalURLState(this).username},getPassword=function(){return getInternalURLState(this).password},getHost=function(){var e=getInternalURLState(this),r=e.host,t=e.port;return null===r?\"\":null===t?serializeHost(r):serializeHost(r)+\":\"+t},getHostname=function(){var e=getInternalURLState(this).host;return null===e?\"\":serializeHost(e)},getPort=function(){var e=getInternalURLState(this).port;return null===e?\"\":String(e)},getPathname=function(){var e=getInternalURLState(this),r=e.path;return e.cannotBeABaseURL?r[0]:r.length?\"/\"+r.join(\"/\"):\"\"},getSearch=function(){var e=getInternalURLState(this).query;return e?\"?\"+e:\"\"},getSearchParams=function(){return getInternalURLState(this).searchParams},getHash=function(){var e=getInternalURLState(this).fragment;return e?\"#\"+e:\"\"},accessorDescriptor=function(e,r){return{get:e,set:r,configurable:!0,enumerable:!0}};if(descriptors&&objectDefineProperties(URLPrototype,{href:accessorDescriptor(serializeURL,(function(e){var r=getInternalURLState(this),t=toString(e),a=parseURL(r,t);if(a)throw TypeError(a);getInternalSearchParamsState(r.searchParams).updateSearchParams(r.query)})),origin:accessorDescriptor(getOrigin),protocol:accessorDescriptor(getProtocol,(function(e){var r=getInternalURLState(this);parseURL(r,toString(e)+\":\",SCHEME_START)})),username:accessorDescriptor(getUsername,(function(e){var r=getInternalURLState(this),t=arrayFrom(toString(e));if(!cannotHaveUsernamePasswordPort(r)){r.username=\"\";for(var a=0;a<t.length;a++)r.username+=percentEncode(t[a],userinfoPercentEncodeSet)}})),password:accessorDescriptor(getPassword,(function(e){var r=getInternalURLState(this),t=arrayFrom(toString(e));if(!cannotHaveUsernamePasswordPort(r)){r.password=\"\";for(var a=0;a<t.length;a++)r.password+=percentEncode(t[a],userinfoPercentEncodeSet)}})),host:accessorDescriptor(getHost,(function(e){var r=getInternalURLState(this);r.cannotBeABaseURL||parseURL(r,toString(e),HOST)})),hostname:accessorDescriptor(getHostname,(function(e){var r=getInternalURLState(this);r.cannotBeABaseURL||parseURL(r,toString(e),HOSTNAME)})),port:accessorDescriptor(getPort,(function(e){var r=getInternalURLState(this);cannotHaveUsernamePasswordPort(r)||(\"\"==(e=toString(e))?r.port=null:parseURL(r,e,PORT))})),pathname:accessorDescriptor(getPathname,(function(e){var r=getInternalURLState(this);r.cannotBeABaseURL||(r.path=[],parseURL(r,toString(e),PATH_START))})),search:accessorDescriptor(getSearch,(function(e){var r=getInternalURLState(this);\"\"==(e=toString(e))?r.query=null:(\"?\"==e.charAt(0)&&(e=e.slice(1)),r.query=\"\",parseURL(r,e,QUERY)),getInternalSearchParamsState(r.searchParams).updateSearchParams(r.query)})),searchParams:accessorDescriptor(getSearchParams),hash:accessorDescriptor(getHash,(function(e){var r=getInternalURLState(this);\"\"!=(e=toString(e))?(\"#\"==e.charAt(0)&&(e=e.slice(1)),r.fragment=\"\",parseURL(r,e,FRAGMENT)):r.fragment=null}))}),redefine(URLPrototype,\"toJSON\",(function toJSON(){return serializeURL.call(this)}),{enumerable:!0}),redefine(URLPrototype,\"toString\",(function toString(){return serializeURL.call(this)}),{enumerable:!0}),NativeURL){var nativeCreateObjectURL=NativeURL.createObjectURL,nativeRevokeObjectURL=NativeURL.revokeObjectURL;nativeCreateObjectURL&&redefine(URLConstructor,\"createObjectURL\",(function createObjectURL(e){return nativeCreateObjectURL.apply(NativeURL,arguments)})),nativeRevokeObjectURL&&redefine(URLConstructor,\"revokeObjectURL\",(function revokeObjectURL(e){return nativeRevokeObjectURL.apply(NativeURL,arguments)}))}setToStringTag(URLConstructor,\"URL\"),_export({global:!0,forced:!nativeUrl,sham:!descriptors},{URL:URLConstructor});var $forEach=arrayIteration.forEach,STRICT_METHOD=arrayMethodIsStrict(\"forEach\"),arrayForEach=STRICT_METHOD?[].forEach:function forEach(e){return $forEach(this,e,arguments.length>1?arguments[1]:void 0)},handlePrototype=function(e){if(e&&e.forEach!==arrayForEach)try{createNonEnumerableProperty(e,\"forEach\",arrayForEach)}catch(r){e.forEach=arrayForEach}};for(var COLLECTION_NAME in domIterables)handlePrototype(global$1[COLLECTION_NAME]&&global$1[COLLECTION_NAME].prototype);handlePrototype(domTokenListPrototype);var propertyIsEnumerable=objectPropertyIsEnumerable.f,createMethod=function(e){return function(r){for(var t,a=toIndexedObject(r),i=objectKeys(a),s=i.length,c=0,l=[];s>c;)t=i[c++],descriptors&&!propertyIsEnumerable.call(a,t)||l.push(e?[t,a[t]]:a[t]);return l}},objectToArray={entries:createMethod(!0),values:createMethod(!1)},$entries=objectToArray.entries;_export({target:\"Object\",stat:!0},{entries:function entries(e){return $entries(e)}});var getOwnPropertyDescriptor=objectGetOwnPropertyDescriptor.f,$startsWith=\"\".startsWith,min$1=Math.min,CORRECT_IS_REGEXP_LOGIC=correctIsRegexpLogic(\"startsWith\"),MDN_POLYFILL_BUG=!(CORRECT_IS_REGEXP_LOGIC||(descriptor=getOwnPropertyDescriptor(String.prototype,\"startsWith\"),!descriptor||descriptor.writable)),descriptor;_export({target:\"String\",proto:!0,forced:!MDN_POLYFILL_BUG&&!CORRECT_IS_REGEXP_LOGIC},{startsWith:function startsWith(e){var r=toString(requireObjectCoercible(this));notARegexp(e);var t=toLength(min$1(arguments.length>1?arguments[1]:void 0,r.length)),a=toString(e);return $startsWith?$startsWith.call(r,a,t):r.slice(t,t+a.length)===a}});var floor=Math.floor,replace=\"\".replace,SUBSTITUTION_SYMBOLS=/\\$([$&'`]|\\d{1,2}|<[^>]*>)/g,SUBSTITUTION_SYMBOLS_NO_NAMED=/\\$([$&'`]|\\d{1,2})/g,getSubstitution=function(e,r,t,a,i,s){var c=t+e.length,l=a.length,u=SUBSTITUTION_SYMBOLS_NO_NAMED;return void 0!==i&&(i=toObject(i),u=SUBSTITUTION_SYMBOLS),replace.call(s,u,(function(s,u){var p;switch(u.charAt(0)){case\"$\":return\"$\";case\"&\":return e;case\"`\":return r.slice(0,t);case\"'\":return r.slice(c);case\"<\":p=i[u.slice(1,-1)];break;default:var d=+u;if(0===d)return s;if(d>l){var h=floor(d/10);return 0===h?s:h<=l?void 0===a[h-1]?u.charAt(1):a[h-1]+u.charAt(1):s}p=a[d-1]}return void 0===p?\"\":p}))},REPLACE=wellKnownSymbol(\"replace\"),max=Math.max,min=Math.min,maybeToString=function(e){return void 0===e?e:String(e)},REPLACE_KEEPS_$0=\"$0\"===\"a\".replace(/./,\"$0\"),REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE=!!/./[REPLACE]&&\"\"===/./[REPLACE](\"a\",\"$0\"),REPLACE_SUPPORTS_NAMED_GROUPS=!fails((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:\"7\"},e},\"7\"!==\"\".replace(e,\"$<a>\")}));fixRegexpWellKnownSymbolLogic(\"replace\",(function(e,r,t){var a=REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE?\"$\":\"$0\";return[function replace(e,t){var a=requireObjectCoercible(this),i=null==e?void 0:getMethod(e,REPLACE);return i?i.call(e,a,t):r.call(toString(a),e,t)},function(e,i){var s=anObject(this),c=toString(e);if(\"string\"==typeof i&&-1===i.indexOf(a)&&-1===i.indexOf(\"$<\")){var l=t(r,s,c,i);if(l.done)return l.value}var u=isCallable(i);u||(i=toString(i));var p=s.global;if(p){var d=s.unicode;s.lastIndex=0}for(var h=[];;){var y=regexpExecAbstract(s,c);if(null===y)break;if(h.push(y),!p)break;\"\"===toString(y[0])&&(s.lastIndex=advanceStringIndex(c,toLength(s.lastIndex),d))}for(var A=\"\",g=0,v=0;v<h.length;v++){y=h[v];for(var E=toString(y[0]),m=max(min(toInteger(y.index),c.length),0),I=[],P=1;P<y.length;P++)I.push(maybeToString(y[P]));var b=y.groups;if(u){var T=[E].concat(I,m,c);void 0!==b&&T.push(b);var S=toString(i.apply(void 0,T))}else S=getSubstitution(E,c,m,I,b,i);m>=g&&(A+=c.slice(g,m)+S,g=m+E.length)}return A+c.slice(g)}]}),!REPLACE_SUPPORTS_NAMED_GROUPS||!REPLACE_KEEPS_$0||REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);var IS_CONCAT_SPREADABLE=wellKnownSymbol(\"isConcatSpreadable\"),MAX_SAFE_INTEGER=9007199254740991,MAXIMUM_ALLOWED_INDEX_EXCEEDED=\"Maximum allowed index exceeded\",IS_CONCAT_SPREADABLE_SUPPORT=engineV8Version>=51||!fails((function(){var e=[];return e[IS_CONCAT_SPREADABLE]=!1,e.concat()[0]!==e})),SPECIES_SUPPORT=arrayMethodHasSpeciesSupport(\"concat\"),isConcatSpreadable=function(e){if(!isObject(e))return!1;var r=e[IS_CONCAT_SPREADABLE];return void 0!==r?!!r:isArray(e)},FORCED=!IS_CONCAT_SPREADABLE_SUPPORT||!SPECIES_SUPPORT;_export({target:\"Array\",proto:!0,forced:FORCED},{concat:function concat(e){var r,t,a,i,s,c=toObject(this),l=arraySpeciesCreate(c,0),u=0;for(r=-1,a=arguments.length;r<a;r++)if(isConcatSpreadable(s=-1===r?c:arguments[r])){if(u+(i=toLength(s.length))>MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);for(t=0;t<i;t++,u++)t in s&&createProperty(l,u,s[t])}else{if(u>=MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);createProperty(l,u++,s)}return l.length=u,l}});var cnt=0,imageCompressionLibUrl,worker;function createWorker(e){var r=[];return\"function\"==typeof e?r.push(\"(\".concat(e,\")()\")):r.push(e),new Worker(URL.createObjectURL(new Blob(r)))}function createSourceObject(e){return URL.createObjectURL(new Blob([e],{type:\"application/javascript\"}))}function stringify(e){return JSON.stringify(e,(function(e,r){return\"function\"==typeof r?\"BIC_FN:::(function () { return \".concat(r.toString(),\" })()\"):r}))}function parse(o){if(\"string\"==typeof o)return o;var result={};return Object.entries(o).forEach((function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(\"string\"==typeof value&&value.startsWith(\"BIC_FN:::\"))try{result[key]=eval(value.replace(/^BIC_FN:::/,\"\"))}catch(e){throw e}else result[key]=parse(value)})),result}function generateLib(){return createSourceObject(\"\\n // reconstruct library\\n function imageCompression (){return (\".concat(imageCompression,\").apply(null, arguments)}\\n\\n imageCompression.getDataUrlFromFile = \").concat(imageCompression.getDataUrlFromFile,\"\\n imageCompression.getFilefromDataUrl = \").concat(imageCompression.getFilefromDataUrl,\"\\n imageCompression.loadImage = \").concat(imageCompression.loadImage,\"\\n imageCompression.drawImageInCanvas = \").concat(imageCompression.drawImageInCanvas,\"\\n imageCompression.drawFileInCanvas = \").concat(imageCompression.drawFileInCanvas,\"\\n imageCompression.canvasToFile = \").concat(imageCompression.canvasToFile,\"\\n imageCompression.getExifOrientation = \").concat(imageCompression.getExifOrientation,\"\\n imageCompression.handleMaxWidthOrHeight = \").concat(imageCompression.handleMaxWidthOrHeight,\"\\n imageCompression.followExifOrientation = \").concat(imageCompression.followExifOrientation,\"\\n imageCompression.cleanupCanvasMemory = \").concat(imageCompression.cleanupCanvasMemory,\"\\n imageCompression.isAutoOrientationInBrowser = \").concat(imageCompression.isAutoOrientationInBrowser,\"\\n imageCompression.approximateBelowMaximumCanvasSizeOfBrowser = \").concat(imageCompression.approximateBelowMaximumCanvasSizeOfBrowser,\"\\n imageCompression.getBrowserName = \").concat(imageCompression.getBrowserName,\"\\n\\n // functions / objects\\n getDataUrlFromFile = imageCompression.getDataUrlFromFile\\n getFilefromDataUrl = imageCompression.getFilefromDataUrl\\n loadImage = imageCompression.loadImage\\n drawImageInCanvas = imageCompression.drawImageInCanvas\\n drawFileInCanvas = imageCompression.drawFileInCanvas\\n canvasToFile = imageCompression.canvasToFile\\n getExifOrientation = imageCompression.getExifOrientation\\n handleMaxWidthOrHeight = imageCompression.handleMaxWidthOrHeight\\n followExifOrientation = imageCompression.followExifOrientation\\n cleanupCanvasMemory = imageCompression.cleanupCanvasMemory\\n isAutoOrientationInBrowser = imageCompression.isAutoOrientationInBrowser\\n approximateBelowMaximumCanvasSizeOfBrowser = imageCompression.approximateBelowMaximumCanvasSizeOfBrowser\\n getBrowserName = imageCompression.getBrowserName\\n isIOS = \").concat(isIOS,\"\\n \\n getNewCanvasAndCtx = \").concat(getNewCanvasAndCtx,\"\\n CustomFileReader = FileReader\\n CustomFile = File\\n MaxCanvasSize = \").concat(JSON.stringify(MaxCanvasSize),\"\\n function compress (){return (\").concat(compress,\").apply(null, arguments)}\\n\\n // core-js\\n function _slicedToArray(arr, n) { return arr }\\n function _typeof(a) { return typeof a }\\n function _objectSpread2(target) {\\n for (var i = 1; i < arguments.length; i++) {\\n var source = arguments[i] != null ? arguments[i] : {};\\n \\n Object.assign(target, source)\\n }\\n \\n return target;\\n }\\n\\n // Libraries\\n const parse = \").concat(parse,\"\\n const UPNG = {}\\n UPNG.toRGBA8 = \").concat(UPNG.toRGBA8,\"\\n UPNG.toRGBA8.decodeImage = \").concat(UPNG.toRGBA8.decodeImage,\"\\n UPNG.decode = \").concat(UPNG.decode,\"\\n UPNG.decode._decompress = \").concat(UPNG.decode._decompress,\"\\n UPNG.decode._inflate = \").concat(UPNG.decode._inflate,\"\\n UPNG.decode._readInterlace = \").concat(UPNG.decode._readInterlace,\"\\n UPNG.decode._getBPP = \").concat(UPNG.decode._getBPP,\" \\n UPNG.decode._filterZero = \").concat(UPNG.decode._filterZero,\"\\n UPNG.decode._paeth = \").concat(UPNG.decode._paeth,\"\\n UPNG.decode._IHDR = \").concat(UPNG.decode._IHDR,\"\\n UPNG._bin = parse(\").concat(stringify(UPNG._bin),\")\\n UPNG._copyTile = \").concat(UPNG._copyTile,\"\\n UPNG.encode = \").concat(UPNG.encode,\"\\n UPNG.encodeLL = \").concat(UPNG.encodeLL,\" \\n UPNG.encode._main = \").concat(UPNG.encode._main,\"\\n UPNG.encode.compressPNG = \").concat(UPNG.encode.compressPNG,\" \\n UPNG.encode.compress = \").concat(UPNG.encode.compress,\"\\n UPNG.encode.framize = \").concat(UPNG.encode.framize,\" \\n UPNG.encode._updateFrame = \").concat(UPNG.encode._updateFrame,\" \\n UPNG.encode._prepareDiff = \").concat(UPNG.encode._prepareDiff,\" \\n UPNG.encode._filterZero = \").concat(UPNG.encode._filterZero,\" \\n UPNG.encode._filterLine = \").concat(UPNG.encode._filterLine,\"\\n UPNG.encode.concatRGBA = \").concat(UPNG.encode.concatRGBA,\"\\n UPNG.crc = parse(\").concat(stringify(UPNG.crc),\")\\n UPNG.crc.table = ( function() {\\n var tab = new Uint32Array(256);\\n for (var n=0; n<256; n++) {\\n var c = n;\\n for (var k=0; k<8; k++) {\\n if (c & 1) c = 0xedb88320 ^ (c >>> 1);\\n else c = c >>> 1;\\n }\\n tab[n] = c; }\\n return tab; })()\\n UPNG.quantize = \").concat(UPNG.quantize,\" \\n UPNG.quantize.getKDtree = \").concat(UPNG.quantize.getKDtree,\" \\n UPNG.quantize.getNearest = \").concat(UPNG.quantize.getNearest,\" \\n UPNG.quantize.planeDst = \").concat(UPNG.quantize.planeDst,\" \\n UPNG.quantize.dist = \").concat(UPNG.quantize.dist,\" \\n UPNG.quantize.splitPixels = \").concat(UPNG.quantize.splitPixels,\" \\n UPNG.quantize.vecDot = \").concat(UPNG.quantize.vecDot,\" \\n UPNG.quantize.stats = \").concat(UPNG.quantize.stats,\" \\n UPNG.quantize.estats = \").concat(UPNG.quantize.estats,\"\\n UPNG.M4 = parse(\").concat(stringify(UPNG.M4),\")\\n UPNG.encode.concatRGBA = \").concat(UPNG.encode.concatRGBA,'\\n UPNG.inflateRaw=function(){\\n var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;\\n if(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;\\n if(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);\\n var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;\\n w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1}if(m==2){J=A(N,d,5)+257;\\n h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var E=d,j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0}for(var c=0;\\n c<Q;c++){var K=A(N,d+c*3,3);b.Q[(b.X[c]<<1)+1]=K;if(K>j)j=K}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;\\n d=l(b.u,(1<<j)-1,J+h,N,d,b.v);var r=V.V(b.v,0,J,b.C);X=(1<<r)-1;var S=V.V(b.v,J,h,b.D);u=(1<<S)-1;M(b.C,r);\\n I(b.C,r,v);M(b.D,S);I(b.D,S,C)}while(!0){var T=v[e(N,d)&X];d+=T&15;var p=T>>>4;if(p>>>8==0){W[w++]=p}else if(p==256){break}else{var z=w+p-254;\\n if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);\\n d+=Y&15;while(w<z){W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a];W[w]=W[w++-a]}w=z}}}return W.length==w?W:W.slice(0,w)};\\n H.H.W=function(N,W){var R=N.length;if(W<=R)return N;var V=new Uint8Array(R<<1);V.set(N,0);return V};\\n H.H.R=function(N,W,R,V,n,A){var l=H.H.e,M=H.H.Z,I=0;while(I<R){var e=N[M(V,n)&W];n+=e&15;var b=e>>>4;\\n if(b<=15){A[I]=b;I++}else{var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1]}else if(b==17){m=3+l(V,n,3);\\n n+=3}else if(b==18){m=11+l(V,n,7);n+=7}var J=I+m;while(I<J){A[I]=Z;I++}}}return n};H.H.V=function(N,W,R,V){var n=0,A=0,l=V.length>>>1;\\n while(A<R){var M=N[A+W];V[A<<1]=0;V[(A<<1)+1]=M;if(M>n)n=M;A++}while(A<l){V[A<<1]=0;V[(A<<1)+1]=0;A++}return n};\\n H.H.n=function(N,W){var R=H.H.m,V=N.length,n,A,l,M,I,e=R.j;for(var M=0;M<=W;M++)e[M]=0;for(M=1;M<V;M+=2)e[N[M]]++;\\n var b=R.K;n=0;e[0]=0;for(A=1;A<=W;A++){n=n+e[A-1]<<1;b[A]=n}for(l=0;l<V;l+=2){I=N[l+1];if(I!=0){N[l]=b[I];\\n b[I]++}}};H.H.A=function(N,W,R){var V=N.length,n=H.H.m,A=n.r;for(var l=0;l<V;l+=2)if(N[l+1]!=0){var M=l>>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<<b,m=Z+(1<<b);\\n while(Z!=m){var J=A[Z]>>>15-W;R[J]=e;Z++}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n<N.length;\\n n+=2){var A=N[n]<<W-N[n+1];N[n]=R[A]>>>V}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8};\\n H.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16};H.H.e=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<<R)-1};\\n H.H.b=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<<R)-1};H.H.Z=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)};\\n H.H.i=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array;\\n return{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new N(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}();\\n (function(){var N=H.H.m,W=1<<15;for(var R=0;R<W;R++){var V=R;V=(V&2863311530)>>>1|(V&1431655765)<<1;\\n V=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8;\\n N.r[R]=(V>>>16|V<<16)>>>17}function n(A,l,M){while(l--!=0)A.push(0,M)}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R];\\n N.c[R]=N.p[R]<<4|N.z[R]}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9);\\n H.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0);\\n n(N.D,30,0);n(N.v,320,0)}());return H.H.N}()\\n \\n const UZIP = {}\\n UZIP[\"parse\"] = ').concat(UZIP_1.parse,\"\\n UZIP._readLocal = \").concat(UZIP_1._readLocal,\"\\n UZIP.inflateRaw = \").concat(UZIP_1.inflateRaw,\"\\n UZIP.inflate = \").concat(UZIP_1.inflate,\"\\n UZIP.deflate = \").concat(UZIP_1.deflate,\"\\n UZIP.deflateRaw = \").concat(UZIP_1.deflateRaw,\"\\n UZIP.encode = \").concat(UZIP_1.encode,\"\\n UZIP._noNeed = \").concat(UZIP_1._noNeed,\"\\n UZIP._writeHeader = \").concat(UZIP_1._writeHeader,\"\\n UZIP.crc = parse(\").concat(stringify(UZIP_1.crc),\")\\n UZIP.crc.table = ( function() {\\n var tab = new Uint32Array(256);\\n for (var n=0; n<256; n++) {\\n var c = n;\\n for (var k=0; k<8; k++) {\\n if (c & 1) c = 0xedb88320 ^ (c >>> 1);\\n else c = c >>> 1;\\n }\\n tab[n] = c; }\\n return tab; })()\\n \\n UZIP.adler = \").concat(UZIP_1.adler,\"\\n UZIP.bin = parse(\").concat(stringify(UZIP_1.bin),\")\\n UZIP.F = {}\\n UZIP.F.deflateRaw = \").concat(UZIP_1.F.deflateRaw,\"\\n UZIP.F._bestMatch = \").concat(UZIP_1.F._bestMatch,\"\\n UZIP.F._howLong = \").concat(UZIP_1.F._howLong,\"\\n UZIP.F._hash = \").concat(UZIP_1.F._hash,\"\\n UZIP.saved = \").concat(UZIP_1.saved,\"\\n UZIP.F._writeBlock = \").concat(UZIP_1.F._writeBlock,\"\\n UZIP.F._copyExact = \").concat(UZIP_1.F._copyExact,\"\\n UZIP.F.getTrees = \").concat(UZIP_1.F.getTrees,\"\\n UZIP.F.getSecond = \").concat(UZIP_1.F.getSecond,\"\\n UZIP.F.nonZero = \").concat(UZIP_1.F.nonZero,\"\\n UZIP.F.contSize = \").concat(UZIP_1.F.contSize,\"\\n UZIP.F._codeTiny = \").concat(UZIP_1.F._codeTiny,\" \\n UZIP.F._lenCodes = \").concat(UZIP_1.F._lenCodes,\" \\n UZIP.F._hufTree = \").concat(UZIP_1.F._hufTree,\" \\n UZIP.F.setDepth = \").concat(UZIP_1.F.setDepth,\" \\n UZIP.F.restrictDepth = \").concat(UZIP_1.F.restrictDepth,\"\\n UZIP.F._goodIndex = \").concat(UZIP_1.F._goodIndex,\" \\n UZIP.F._writeLit = \").concat(UZIP_1.F._writeLit,\" \\n UZIP.F.inflate = \").concat(UZIP_1.F.inflate,\" \\n UZIP.F._check = \").concat(UZIP_1.F._check,\" \\n UZIP.F._decodeTiny = \").concat(UZIP_1.F._decodeTiny,\" \\n UZIP.F._copyOut = \").concat(UZIP_1.F._copyOut,\" \\n UZIP.F.makeCodes = \").concat(UZIP_1.F.makeCodes,\" \\n UZIP.F.codes2map = \").concat(UZIP_1.F.codes2map,\" \\n UZIP.F.revCodes = \").concat(UZIP_1.F.revCodes,\" \\n\\n // used only in deflate\\n UZIP.F._putsE = \").concat(UZIP_1.F._putsE,\"\\n UZIP.F._putsF = \").concat(UZIP_1.F._putsF,\"\\n \\n UZIP.F._bitsE = \").concat(UZIP_1.F._bitsE,\"\\n UZIP.F._bitsF = \").concat(UZIP_1.F._bitsF,\"\\n\\n UZIP.F._get17 = \").concat(UZIP_1.F._get17,\"\\n UZIP.F._get25 = \").concat(UZIP_1.F._get25,\"\\n UZIP.F.U = function(){\\n var u16=Uint16Array, u32=Uint32Array;\\n return {\\n next_code : new u16(16),\\n bl_count : new u16(16),\\n ordr : [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],\\n of0 : [3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],\\n exb : [0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0],\\n ldef : new u16(32),\\n df0 : [1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 65535, 65535],\\n dxb : [0,0,0,0,1,1,2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0],\\n ddef : new u32(32),\\n flmap: new u16( 512), fltree: [],\\n fdmap: new u16( 32), fdtree: [],\\n lmap : new u16(32768), ltree : [], ttree:[],\\n dmap : new u16(32768), dtree : [],\\n imap : new u16( 512), itree : [],\\n //rev9 : new u16( 512)\\n rev15: new u16(1<<15),\\n lhst : new u32(286), dhst : new u32( 30), ihst : new u32(19),\\n lits : new u32(15000),\\n strt : new u16(1<<16),\\n prev : new u16(1<<15)\\n };\\n } ();\\n\\n (function(){\\n var U = UZIP.F.U;\\n var len = 1<<15;\\n for(var i=0; i<len; i++) {\\n var x = i;\\n x = (((x & 0xaaaaaaaa) >>> 1) | ((x & 0x55555555) << 1));\\n x = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));\\n x = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));\\n x = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));\\n U.rev15[i] = (((x >>> 16) | (x << 16)))>>>17;\\n }\\n \\n function pushV(tgt, n, sv) { while(n--!=0) tgt.push(0,sv); }\\n \\n for(var i=0; i<32; i++) { U.ldef[i]=(U.of0[i]<<3)|U.exb[i]; U.ddef[i]=(U.df0[i]<<4)|U.dxb[i]; }\\n \\n pushV(U.fltree, 144, 8); pushV(U.fltree, 255-143, 9); pushV(U.fltree, 279-255, 7); pushV(U.fltree,287-279,8);\\n /*\\n var i = 0;\\n for(; i<=143; i++) U.fltree.push(0,8);\\n for(; i<=255; i++) U.fltree.push(0,9);\\n for(; i<=279; i++) U.fltree.push(0,7);\\n for(; i<=287; i++) U.fltree.push(0,8);\\n */\\n UZIP.F.makeCodes(U.fltree, 9);\\n UZIP.F.codes2map(U.fltree, 9, U.flmap);\\n UZIP.F.revCodes (U.fltree, 9)\\n \\n pushV(U.fdtree,32,5);\\n //for(i=0;i<32; i++) U.fdtree.push(0,5);\\n UZIP.F.makeCodes(U.fdtree, 5);\\n UZIP.F.codes2map(U.fdtree, 5, U.fdmap);\\n UZIP.F.revCodes (U.fdtree, 5)\\n \\n pushV(U.itree,19,0); pushV(U.ltree,286,0); pushV(U.dtree,30,0); pushV(U.ttree,320,0);\\n /*\\n for(var i=0; i< 19; i++) U.itree.push(0,0);\\n for(var i=0; i<286; i++) U.ltree.push(0,0);\\n for(var i=0; i< 30; i++) U.dtree.push(0,0);\\n for(var i=0; i<320; i++) U.ttree.push(0,0);\\n */\\n })()\\n \"))}function generateWorkerScript(){return createWorker(\"\\n let scriptImported = false\\n self.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n })\\n \")}function compressOnWebWorker(e,r){return new Promise((function(t,a){var i=cnt+=1;imageCompressionLibUrl||(imageCompressionLibUrl=generateLib()),worker||(worker=generateWorkerScript()),worker.addEventListener(\"message\",(function handler(e){if(e.data.id===i){if(void 0!==e.data.progress)return void r.onProgress(e.data.progress);worker.removeEventListener(\"message\",handler),e.data.error&&a(new Error(e.data.error)),t(e.data.file)}})),worker.addEventListener(\"error\",a),worker.postMessage({file:e,id:i,imageCompressionLibUrl:imageCompressionLibUrl,options:_objectSpread2(_objectSpread2({},r),{},{onProgress:void 0})})}))}function imageCompression(e,r){return new Promise((function(t,a){var i,s,c,l,u,p;if(i=_objectSpread2({},r),c=0,l=i.onProgress,i.maxSizeMB=i.maxSizeMB||Number.POSITIVE_INFINITY,u=\"boolean\"!=typeof i.useWebWorker||i.useWebWorker,delete i.useWebWorker,i.onProgress=function(e){c=e,\"function\"==typeof l&&l(c)},!(e instanceof Blob||e instanceof CustomFile))return a(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return a(new Error(\"The file given is not an image\"));if(p=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!u||\"function\"!=typeof Worker||p)return compress(e,i).then(function(e){try{return s=e,$If_3.call(this)}catch(e){return a(e)}}.bind(this),a);var d=function(){try{return $If_3.call(this)}catch(e){return a(e)}}.bind(this),h=function $Try_1_Catch(r){try{return compress(e,i).then((function(e){try{return s=e,d()}catch(e){return a(e)}}),a)}catch(e){return a(e)}};try{return compressOnWebWorker(e,i).then((function(e){try{return s=e,d()}catch(e){return h()}}),h)}catch(e){h()}function $If_3(){try{s.name=e.name,s.lastModified=e.lastModified}catch(e){}return t(s)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"1.0.16\";\n//# sourceMappingURL=browser-image-compression.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24vZGlzdC9icm93c2VyLWltYWdlLWNvbXByZXNzaW9uLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQiw4QkFBOEIsb0NBQW9DLDZCQUE2QiwyQ0FBMkMsbUNBQW1DLDZCQUE2QixhQUFhLEdBQUcsR0FBRyxvQkFBb0Isd0JBQXdCLHFCQUFxQixpQ0FBaUMsc0NBQXNDLDRCQUE0Qix1REFBdUQsc0JBQXNCLFNBQVMsMkJBQTJCLFlBQVksbUJBQW1CLEtBQUsseUNBQXlDLGlEQUFpRCwwQkFBMEIsNklBQTZJLGdFQUFnRSxHQUFHLFNBQVMsZ0NBQWdDLHlDQUF5QyxrREFBa0QsV0FBVyw2QkFBNkIsNEdBQTRHLDRCQUE0Qiw2QkFBNkIsb0NBQW9DLG1GQUFtRixZQUFZLHVCQUF1QixJQUFJLGdCQUFnQiwyREFBMkQsT0FBTyxTQUFTLFNBQVMsUUFBUSxJQUFJLDhCQUE4QixRQUFRLGNBQWMsVUFBVSwwQ0FBMEMsTUFBTSxvREFBb0Qsb0RBQW9ELGdNQUFnTSxnQ0FBZ0Msb0NBQW9DLDJCQUEyQixJQUFJLGNBQWMsU0FBUyw0QkFBNEIsaUtBQWlLLGtLQUFrSyxpQ0FBaUMsT0FBTyxZQUFZLGdDQUFnQyxzQkFBc0IsMEJBQTBCLHlNQUF5TSxZQUFZLGdFQUFnRSxJQUFJLGtDQUFrQyxvQ0FBb0MsRUFBRSxTQUFTLGNBQWMsU0FBUywwRUFBMEUsK0RBQStELHlCQUF5QixzREFBc0QsRUFBRSx1QkFBdUIsZ0ZBQWdGLEVBQUUsc0NBQXNDLHNEQUFzRCxTQUFTLHNCQUFzQix5Q0FBeUMsa0JBQWtCLDBEQUEwRCwwQ0FBMEMsNENBQTRDLHlFQUF5RSx3QkFBd0IsMkJBQTJCLHVCQUF1Qiw4QkFBOEIsMEJBQTBCLDZFQUE2RSx5TUFBeU0sK05BQStOLHdEQUF3RCxJQUFJLFlBQVksU0FBUyxVQUFVLGlFQUFpRSxlQUFl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QXVCLG1CQUFtQixhQUFhLGdDQUFnQywwR0FBMEcsZ0JBQWdCLDRDQUE0QyxzRUFBc0UsY0FBYyxjQUFjLGdDQUFnQyw4S0FBOEssa0pBQWtKLDBCQUEwQixXQUFXLFdBQVcsNEVBQTRFLHdDQUF3QyxVQUFVLE9BQU8sUUFBUSxrQ0FBa0Msa0NBQWtDLGFBQWEsOEpBQThKLGtCQUFrQixzRUFBc0UsdUdBQXVHLDBEQUEwRCxrR0FBa0csTUFBTSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsR0FBRywrQkFBK0Isa0NBQWtDLGdCQUFnQixzQkFBc0IsMktBQTJLLCtCQUErQix3SEFBd0gsZ0ZBQWdGLHFKQUFxSixJQUFJLDRCQUE0QixTQUFTLGFBQWEsZUFBZSxpQkFBaUIsSUFBSSx3QkFBd0IsU0FBUyxhQUFhLHVDQUF1QyxJQUFJLHVDQUF1QyxJQUFJLGVBQWUsU0FBUyxhQUFhLEtBQUssU0FBUyxjQUFjLElBQUksa0RBQWtELElBQUksZUFBZSxTQUFTLFlBQVksS0FBSyxTQUFTLElBQUksaUJBQWlCLElBQUksNENBQTRDLFVBQVUsYUFBYSxHQUFHLGl4QkFBcXpCO0FBQzErN0siLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24vZGlzdC9icm93c2VyLWltYWdlLWNvbXByZXNzaW9uLm1qcz9jYzE0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3NlciBJbWFnZSBDb21wcmVzc2lvblxuICogdjEuMC4xNlxuICogYnkgRG9uYWxkIDxkb25hbGRjd2xAZ21haWwuY29tPlxuICogaHR0cHM6Ly9naXRodWIuY29tL0RvbmFsZGN3bC9icm93c2VyLWltYWdlLWNvbXByZXNzaW9uXG4gKi9cblxuZnVuY3Rpb24gX21lcmdlTmFtZXNwYWNlcyhlLHIpe3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHIpe09iamVjdC5rZXlzKHIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKFwiZGVmYXVsdFwiIT09dCYmISh0IGluIGUpKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxhLmdldD9hOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByW3RdfX0pfX0pKX0pKSxPYmplY3QuZnJlZXplKGUpfWZ1bmN0aW9uIG93bktleXMkMShlLHIpe3ZhciB0PU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7ciYmKGE9YS5maWx0ZXIoKGZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscikuZW51bWVyYWJsZX0pKSksdC5wdXNoLmFwcGx5KHQsYSl9cmV0dXJuIHR9ZnVuY3Rpb24gX29iamVjdFNwcmVhZDIoZSl7Zm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl7dmFyIHQ9bnVsbCE9YXJndW1lbnRzW3JdP2FyZ3VtZW50c1tyXTp7fTtyJTI/b3duS2V5cyQxKE9iamVjdCh0KSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24ocil7X2RlZmluZVByb3BlcnR5KGUscix0W3JdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTpvd25LZXlzJDEoT2JqZWN0KHQpKS5mb3JFYWNoKChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKSl9KSl9cmV0dXJuIGV9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUscix0KXtyZXR1cm4gciBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3JdPXQsZX1mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShlLHIpe3JldHVybiBfYXJyYXlXaXRoSG9sZXMoZSl8fF9pdGVyYWJsZVRvQXJyYXlMaW1pdChlLHIpfHxfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoZSxyKXx8X25vbkl0ZXJhYmxlUmVzdCgpfWZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfWZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChlLHIpe3ZhciB0PW51bGw9PWU/bnVsbDpcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbXCJAQGl0ZXJhdG9yXCJdO2lmKG51bGwhPXQpe3ZhciBhLGkscz1bXSxjPSEwLGw9ITE7dHJ5e2Zvcih0PXQuY2FsbChlKTshKGM9KGE9dC5uZXh0KCkpLmRvbmUpJiYocy5wdXNoKGEudmFsdWUpLCFyfHxzLmxlbmd0aCE9PXIpO2M9ITApO31jYXRjaChlKXtsPSEwLGk9ZX1maW5hbGx5e3RyeXtjfHxudWxsPT10LnJldHVybnx8dC5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgaX19cmV0dXJuIHN9fWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShlLHIpe2lmKGUpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheShlLHIpO3ZhciB0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm5cIk9iamVjdFwiPT09dCYmZS5jb25zdHJ1Y3RvciYmKHQ9ZS5jb25zdHJ1Y3Rvci5uYW1lKSxcIk1hcFwiPT09dHx8XCJTZXRcIj09PXQ/QXJyYXkuZnJvbShlKTpcIkFyZ3VtZW50c1wiPT09dHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCk/X2FycmF5TGlrZVRvQXJyYXkoZSxyKTp2b2lkIDB9fWZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGUscil7KG51bGw9PXJ8fHI+ZS5sZW5ndGgpJiYocj1lLmxlbmd0aCk7Zm9yKHZhciB0PTAsYT1uZXcgQXJyYXkocik7dDxyO3QrKylhW3RdPWVbdF07cmV0dXJuIGF9ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9dmFyIGNvbW1vbmpzR2xvYmFsPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShlKXt2YXIgcj17ZXhwb3J0czp7fX07cmV0dXJuIGUocixyLmV4cG9ydHMpLHIuZXhwb3J0c312YXIgY2hlY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX0sZ2xvYmFsJDE9Y2hlY2soXCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxjaGVjayhcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxjaGVjayhcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGNoZWNrKFwib2JqZWN0XCI9PXR5cGVvZiBjb21tb25qc0dsb2JhbCYmY29tbW9uanNHbG9iYWwpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCksaXNQdXJlPSExLHNldEdsb2JhbD1mdW5jdGlvbihlLHIpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsJDEsZSx7dmFsdWU6cixjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KX1jYXRjaCh0KXtnbG9iYWwkMVtlXT1yfXJldHVybiByfSxTSEFSRUQ9XCJfX2NvcmUtanNfc2hhcmVkX19cIixzdG9yZSQxPWdsb2JhbCQxW1NIQVJFRF18fHNldEdsb2JhbChTSEFSRUQse30pLHNoYXJlZFN0b3JlPXN0b3JlJDEsc2hhcmVkPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKChmdW5jdGlvbihlKXsoZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7cmV0dXJuIHNoYXJlZFN0b3JlW2VdfHwoc2hhcmVkU3RvcmVbZV09dm9pZCAwIT09cj9yOnt9KX0pKFwidmVyc2lvbnNcIixbXSkucHVzaCh7dmVyc2lvbjpcIjMuMTguMFwiLG1vZGU6XCJnbG9iYWxcIixjb3B5cmlnaHQ6XCLCqSAyMDIxIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpXCJ9KX0pKSxyZXF1aXJlT2JqZWN0Q29lcmNpYmxlPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gXCIrZSk7cmV0dXJuIGV9LHRvT2JqZWN0PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShlKSl9LGhhc093blByb3BlcnR5PXt9Lmhhc093blByb3BlcnR5LGhhcyQxPU9iamVjdC5oYXNPd258fGZ1bmN0aW9uIGhhc093bihlLHIpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHRvT2JqZWN0KGUpLHIpfSxpZD0wLHBvc3RmaXg9TWF0aC5yYW5kb20oKSx1aWQ9ZnVuY3Rpb24oZSl7cmV0dXJuXCJTeW1ib2woXCIrU3RyaW5nKHZvaWQgMD09PWU/XCJcIjplKStcIilfXCIrKCsraWQrcG9zdGZpeCkudG9TdHJpbmcoMzYpfSxpc0NhbGxhYmxlPWZ1bmN0aW9uKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9LGFGdW5jdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gaXNDYWxsYWJsZShlKT9lOnZvaWQgMH0sZ2V0QnVpbHRJbj1mdW5jdGlvbihlLHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/YUZ1bmN0aW9uKGdsb2JhbCQxW2VdKTpnbG9iYWwkMVtlXSYmZ2xvYmFsJDFbZV1bcl19LGVuZ2luZVVzZXJBZ2VudD1nZXRCdWlsdEluKFwibmF2aWdhdG9yXCIsXCJ1c2VyQWdlbnRcIil8fFwiXCIscHJvY2VzcyQzPWdsb2JhbCQxLnByb2Nlc3MsRGVubz1nbG9iYWwkMS5EZW5vLHZlcnNpb25zPXByb2Nlc3MkMyYmcHJvY2VzcyQzLnZlcnNpb25zfHxEZW5vJiZEZW5vLnZlcnNpb24sdjg9dmVyc2lvbnMmJnZlcnNpb25zLnY4LG1hdGNoLHZlcnNpb247djg/KG1hdGNoPXY4LnNwbGl0KFwiLlwiKSx2ZXJzaW9uPW1hdGNoWzBdPDQ/MTptYXRjaFswXSttYXRjaFsxXSk6ZW5naW5lVXNlckFnZW50JiYobWF0Y2g9ZW5naW5lVXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvKFxcZCspLyksKCFtYXRjaHx8bWF0Y2hbMV0+PTc0KSYmKG1hdGNoPWVuZ2luZVVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyksbWF0Y2gmJih2ZXJzaW9uPW1hdGNoWzFdKSkpO3ZhciBlbmdpbmVWOFZlcnNpb249dmVyc2lvbiYmK3ZlcnNpb24sZmFpbHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX0sbmF0aXZlU3ltYm9sPSEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmIWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPVN5bWJvbCgpO3JldHVybiFTdHJpbmcoZSl8fCEoT2JqZWN0KGUpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJmVuZ2luZVY4VmVyc2lvbiYmZW5naW5lVjhWZXJzaW9uPDQxfSkpLHVzZVN5bWJvbEFzVWlkPW5hdGl2ZVN5bWJvbCYmIVN5bWJvbC5zaGFtJiZcInN5bWJvbFwiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yLFdlbGxLbm93blN5bWJvbHNTdG9yZT1zaGFyZWQoXCJ3a3NcIiksU3ltYm9sJDE9Z2xvYmFsJDEuU3ltYm9sLGNyZWF0ZVdlbGxLbm93blN5bWJvbD11c2VTeW1ib2xBc1VpZD9TeW1ib2wkMTpTeW1ib2wkMSYmU3ltYm9sJDEud2l0aG91dFNldHRlcnx8dWlkLHdlbGxLbm93blN5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4gaGFzJDEoV2VsbEtub3duU3ltYm9sc1N0b3JlLGUpJiYobmF0aXZlU3ltYm9sfHxcInN0cmluZ1wiPT10eXBlb2YgV2VsbEtub3duU3ltYm9sc1N0b3JlW2VdKXx8KG5hdGl2ZVN5bWJvbCYmaGFzJDEoU3ltYm9sJDEsZSk/V2VsbEtub3duU3ltYm9sc1N0b3JlW2VdPVN5bWJvbCQxW2VdOldlbGxLbm93blN5bWJvbHNTdG9yZVtlXT1jcmVhdGVXZWxsS25vd25TeW1ib2woXCJTeW1ib2wuXCIrZSkpLFdlbGxLbm93blN5bWJvbHNTdG9yZVtlXX0sVE9fU1RSSU5HX1RBRyQ0PXdlbGxLbm93blN5bWJvbChcInRvU3RyaW5nVGFnXCIpLHRlc3QkMT17fTt0ZXN0JDFbVE9fU1RSSU5HX1RBRyQ0XT1cInpcIjt2YXIgdG9TdHJpbmdUYWdTdXBwb3J0PVwiW29iamVjdCB6XVwiPT09U3RyaW5nKHRlc3QkMSksZGVzY3JpcHRvcnM9IWZhaWxzKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSksaXNPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGU/bnVsbCE9PWU6aXNDYWxsYWJsZShlKX0sZG9jdW1lbnQkMz1nbG9iYWwkMS5kb2N1bWVudCxFWElTVFMkMT1pc09iamVjdChkb2N1bWVudCQzKSYmaXNPYmplY3QoZG9jdW1lbnQkMy5jcmVhdGVFbGVtZW50KSxkb2N1bWVudENyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIEVYSVNUUyQxP2RvY3VtZW50JDMuY3JlYXRlRWxlbWVudChlKTp7fX0saWU4RG9tRGVmaW5lPSFkZXNjcmlwdG9ycyYmIWZhaWxzKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnRDcmVhdGVFbGVtZW50KFwiZGl2XCIpLFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpLGFuT2JqZWN0PWZ1bmN0aW9uKGUpe2lmKGlzT2JqZWN0KGUpKXJldHVybiBlO3Rocm93IFR5cGVFcnJvcihTdHJpbmcoZSkrXCIgaXMgbm90IGFuIG9iamVjdFwiKX0saXNTeW1ib2w9dXNlU3ltYm9sQXNVaWQ/ZnVuY3Rpb24oZSl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3ZhciByPWdldEJ1aWx0SW4oXCJTeW1ib2xcIik7cmV0dXJuIGlzQ2FsbGFibGUocikmJk9iamVjdChlKWluc3RhbmNlb2Ygcn0sdHJ5VG9TdHJpbmc9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBTdHJpbmcoZSl9Y2F0Y2goZSl7cmV0dXJuXCJPYmplY3RcIn19LGFDYWxsYWJsZT1mdW5jdGlvbihlKXtpZihpc0NhbGxhYmxlKGUpKXJldHVybiBlO3Rocm93IFR5cGVFcnJvcih0cnlUb1N0cmluZyhlKStcIiBpcyBub3QgYSBmdW5jdGlvblwiKX0sZ2V0TWV0aG9kPWZ1bmN0aW9uKGUscil7dmFyIHQ9ZVtyXTtyZXR1cm4gbnVsbD09dD92b2lkIDA6YUNhbGxhYmxlKHQpfSxvcmRpbmFyeVRvUHJpbWl0aXZlPWZ1bmN0aW9uKGUscil7dmFyIHQsYTtpZihcInN0cmluZ1wiPT09ciYmaXNDYWxsYWJsZSh0PWUudG9TdHJpbmcpJiYhaXNPYmplY3QoYT10LmNhbGwoZSkpKXJldHVybiBhO2lmKGlzQ2FsbGFibGUodD1lLnZhbHVlT2YpJiYhaXNPYmplY3QoYT10LmNhbGwoZSkpKXJldHVybiBhO2lmKFwic3RyaW5nXCIhPT1yJiZpc0NhbGxhYmxlKHQ9ZS50b1N0cmluZykmJiFpc09iamVjdChhPXQuY2FsbChlKSkpcmV0dXJuIGE7dGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpfSxUT19QUklNSVRJVkU9d2VsbEtub3duU3ltYm9sKFwidG9QcmltaXRpdmVcIiksdG9QcmltaXRpdmU9ZnVuY3Rpb24oZSxyKXtpZighaXNPYmplY3QoZSl8fGlzU3ltYm9sKGUpKXJldHVybiBlO3ZhciB0LGE9Z2V0TWV0aG9kKGUsVE9fUFJJTUlUSVZFKTtpZihhKXtpZih2b2lkIDA9PT1yJiYocj1cImRlZmF1bHRcIiksdD1hLmNhbGwoZSxyKSwhaXNPYmplY3QodCl8fGlzU3ltYm9sKHQpKXJldHVybiB0O3Rocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKX1yZXR1cm4gdm9pZCAwPT09ciYmKHI9XCJudW1iZXJcIiksb3JkaW5hcnlUb1ByaW1pdGl2ZShlLHIpfSx0b1Byb3BlcnR5S2V5PWZ1bmN0aW9uKGUpe3ZhciByPXRvUHJpbWl0aXZlKGUsXCJzdHJpbmdcIik7cmV0dXJuIGlzU3ltYm9sKHIpP3I6U3RyaW5nKHIpfSwkZGVmaW5lUHJvcGVydHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGYkNT1kZXNjcmlwdG9ycz8kZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoZSxyLHQpe2lmKGFuT2JqZWN0KGUpLHI9dG9Qcm9wZXJ0eUtleShyKSxhbk9iamVjdCh0KSxpZThEb21EZWZpbmUpdHJ5e3JldHVybiAkZGVmaW5lUHJvcGVydHkoZSxyLHQpfWNhdGNoKGUpe31pZihcImdldFwiaW4gdHx8XCJzZXRcImluIHQpdGhyb3cgVHlwZUVycm9yKFwiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWRcIik7cmV0dXJuXCJ2YWx1ZVwiaW4gdCYmKGVbcl09dC52YWx1ZSksZX0sb2JqZWN0RGVmaW5lUHJvcGVydHk9e2Y6ZiQ1fSxjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3I9ZnVuY3Rpb24oZSxyKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6cn19LGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eT1kZXNjcmlwdG9ycz9mdW5jdGlvbihlLHIsdCl7cmV0dXJuIG9iamVjdERlZmluZVByb3BlcnR5LmYoZSxyLGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigxLHQpKX06ZnVuY3Rpb24oZSxyLHQpe3JldHVybiBlW3JdPXQsZX0sZnVuY3Rpb25Ub1N0cmluZz1GdW5jdGlvbi50b1N0cmluZztpc0NhbGxhYmxlKHNoYXJlZFN0b3JlLmluc3BlY3RTb3VyY2UpfHwoc2hhcmVkU3RvcmUuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGUpfSk7dmFyIGluc3BlY3RTb3VyY2U9c2hhcmVkU3RvcmUuaW5zcGVjdFNvdXJjZSxXZWFrTWFwJDE9Z2xvYmFsJDEuV2Vha01hcCxuYXRpdmVXZWFrTWFwPWlzQ2FsbGFibGUoV2Vha01hcCQxKSYmL25hdGl2ZSBjb2RlLy50ZXN0KGluc3BlY3RTb3VyY2UoV2Vha01hcCQxKSksa2V5cyQyPXNoYXJlZChcImtleXNcIiksc2hhcmVkS2V5PWZ1bmN0aW9uKGUpe3JldHVybiBrZXlzJDJbZV18fChrZXlzJDJbZV09dWlkKGUpKX0saGlkZGVuS2V5cyQxPXt9LE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEPVwiT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWRcIixXZWFrTWFwPWdsb2JhbCQxLldlYWtNYXAsc2V0JDIsZ2V0JDEsaGFzLGVuZm9yY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGhhcyhlKT9nZXQkMShlKTpzZXQkMihlLHt9KX0sZ2V0dGVyRm9yPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgdDtpZighaXNPYmplY3Qocil8fCh0PWdldCQxKHIpKS50eXBlIT09ZSl0aHJvdyBUeXBlRXJyb3IoXCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsIFwiK2UrXCIgcmVxdWlyZWRcIik7cmV0dXJuIHR9fTtpZihuYXRpdmVXZWFrTWFwfHxzaGFyZWRTdG9yZS5zdGF0ZSl7dmFyIHN0b3JlPXNoYXJlZFN0b3JlLnN0YXRlfHwoc2hhcmVkU3RvcmUuc3RhdGU9bmV3IFdlYWtNYXApLHdtZ2V0PXN0b3JlLmdldCx3bWhhcz1zdG9yZS5oYXMsd21zZXQ9c3RvcmUuc2V0O3NldCQyPWZ1bmN0aW9uKGUscil7aWYod21oYXMuY2FsbChzdG9yZSxlKSl0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtyZXR1cm4gci5mYWNhZGU9ZSx3bXNldC5jYWxsKHN0b3JlLGUscikscn0sZ2V0JDE9ZnVuY3Rpb24oZSl7cmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsZSl8fHt9fSxoYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsZSl9fWVsc2V7dmFyIFNUQVRFPXNoYXJlZEtleShcInN0YXRlXCIpO2hpZGRlbktleXMkMVtTVEFURV09ITAsc2V0JDI9ZnVuY3Rpb24oZSxyKXtpZihoYXMkMShlLFNUQVRFKSl0aHJvdyBuZXcgVHlwZUVycm9yKE9CSkVDVF9BTFJFQURZX0lOSVRJQUxJWkVEKTtyZXR1cm4gci5mYWNhZGU9ZSxjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZSxTVEFURSxyKSxyfSxnZXQkMT1mdW5jdGlvbihlKXtyZXR1cm4gaGFzJDEoZSxTVEFURSk/ZVtTVEFURV06e319LGhhcz1mdW5jdGlvbihlKXtyZXR1cm4gaGFzJDEoZSxTVEFURSl9fXZhciBpbnRlcm5hbFN0YXRlPXtzZXQ6c2V0JDIsZ2V0OmdldCQxLGhhczpoYXMsZW5mb3JjZTplbmZvcmNlLGdldHRlckZvcjpnZXR0ZXJGb3J9LEZ1bmN0aW9uUHJvdG90eXBlJDE9RnVuY3Rpb24ucHJvdG90eXBlLGdldERlc2NyaXB0b3I9ZGVzY3JpcHRvcnMmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsRVhJU1RTPWhhcyQxKEZ1bmN0aW9uUHJvdG90eXBlJDEsXCJuYW1lXCIpLFBST1BFUj1FWElTVFMmJlwic29tZXRoaW5nXCI9PT1mdW5jdGlvbiBzb21ldGhpbmcoKXt9Lm5hbWUsQ09ORklHVVJBQkxFPUVYSVNUUyYmKCFkZXNjcmlwdG9yc3x8ZGVzY3JpcHRvcnMmJmdldERlc2NyaXB0b3IoRnVuY3Rpb25Qcm90b3R5cGUkMSxcIm5hbWVcIikuY29uZmlndXJhYmxlKSxmdW5jdGlvbk5hbWU9e0VYSVNUUzpFWElTVFMsUFJPUEVSOlBST1BFUixDT05GSUdVUkFCTEU6Q09ORklHVVJBQkxFfSxyZWRlZmluZT1jcmVhdGVDb21tb25qc01vZHVsZSgoZnVuY3Rpb24oZSl7dmFyIHI9ZnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRSx0PWludGVybmFsU3RhdGUuZ2V0LGE9aW50ZXJuYWxTdGF0ZS5lbmZvcmNlLGk9U3RyaW5nKFN0cmluZykuc3BsaXQoXCJTdHJpbmdcIik7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQscyxjKXt2YXIgbCx1PSEhYyYmISFjLnVuc2FmZSxwPSEhYyYmISFjLmVudW1lcmFibGUsZD0hIWMmJiEhYy5ub1RhcmdldEdldCxoPWMmJnZvaWQgMCE9PWMubmFtZT9jLm5hbWU6dDtpc0NhbGxhYmxlKHMpJiYoXCJTeW1ib2woXCI9PT1TdHJpbmcoaCkuc2xpY2UoMCw3KSYmKGg9XCJbXCIrU3RyaW5nKGgpLnJlcGxhY2UoL15TeW1ib2xcXCgoW14pXSopXFwpLyxcIiQxXCIpK1wiXVwiKSwoIWhhcyQxKHMsXCJuYW1lXCIpfHxyJiZzLm5hbWUhPT1oKSYmY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KHMsXCJuYW1lXCIsaCksKGw9YShzKSkuc291cmNlfHwobC5zb3VyY2U9aS5qb2luKFwic3RyaW5nXCI9PXR5cGVvZiBoP2g6XCJcIikpKSxlIT09Z2xvYmFsJDE/KHU/IWQmJmVbdF0mJihwPSEwKTpkZWxldGUgZVt0XSxwP2VbdF09czpjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoZSx0LHMpKTpwP2VbdF09czpzZXRHbG9iYWwodCxzKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSxcInRvU3RyaW5nXCIsKGZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuIGlzQ2FsbGFibGUodGhpcykmJnQodGhpcykuc291cmNlfHxpbnNwZWN0U291cmNlKHRoaXMpfSkpfSkpLHRvU3RyaW5nJDE9e30udG9TdHJpbmcsY2xhc3NvZlJhdz1mdW5jdGlvbihlKXtyZXR1cm4gdG9TdHJpbmckMS5jYWxsKGUpLnNsaWNlKDgsLTEpfSxUT19TVFJJTkdfVEFHJDM9d2VsbEtub3duU3ltYm9sKFwidG9TdHJpbmdUYWdcIiksQ09SUkVDVF9BUkdVTUVOVFM9XCJBcmd1bWVudHNcIj09Y2xhc3NvZlJhdyhmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHRyeUdldD1mdW5jdGlvbihlLHIpe3RyeXtyZXR1cm4gZVtyXX1jYXRjaChlKXt9fSxjbGFzc29mPXRvU3RyaW5nVGFnU3VwcG9ydD9jbGFzc29mUmF3OmZ1bmN0aW9uKGUpe3ZhciByLHQsYTtyZXR1cm4gdm9pZCAwPT09ZT9cIlVuZGVmaW5lZFwiOm51bGw9PT1lP1wiTnVsbFwiOlwic3RyaW5nXCI9PXR5cGVvZih0PXRyeUdldChyPU9iamVjdChlKSxUT19TVFJJTkdfVEFHJDMpKT90OkNPUlJFQ1RfQVJHVU1FTlRTP2NsYXNzb2ZSYXcocik6XCJPYmplY3RcIj09KGE9Y2xhc3NvZlJhdyhyKSkmJmlzQ2FsbGFibGUoci5jYWxsZWUpP1wiQXJndW1lbnRzXCI6YX0sb2JqZWN0VG9TdHJpbmc9dG9TdHJpbmdUYWdTdXBwb3J0P3t9LnRvU3RyaW5nOmZ1bmN0aW9uIHRvU3RyaW5nKCl7cmV0dXJuXCJbb2JqZWN0IFwiK2NsYXNzb2YodGhpcykrXCJdXCJ9O3RvU3RyaW5nVGFnU3VwcG9ydHx8cmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSxcInRvU3RyaW5nXCIsb2JqZWN0VG9TdHJpbmcse3Vuc2FmZTohMH0pO3ZhciAkcHJvcGVydHlJc0VudW1lcmFibGU9e30ucHJvcGVydHlJc0VudW1lcmFibGUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixOQVNIT1JOX0JVRz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkNCYmISRwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsxOjJ9LDEpLGYkND1OQVNIT1JOX0JVRz9mdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShlKXt2YXIgcj1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkNCh0aGlzLGUpO3JldHVybiEhciYmci5lbnVtZXJhYmxlfTokcHJvcGVydHlJc0VudW1lcmFibGUsb2JqZWN0UHJvcGVydHlJc0VudW1lcmFibGU9e2Y6ZiQ0fSxzcGxpdD1cIlwiLnNwbGl0LGluZGV4ZWRPYmplY3Q9ZmFpbHMoKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdChcInpcIikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KSk/ZnVuY3Rpb24oZSl7cmV0dXJuXCJTdHJpbmdcIj09Y2xhc3NvZlJhdyhlKT9zcGxpdC5jYWxsKGUsXCJcIik6T2JqZWN0KGUpfTpPYmplY3QsdG9JbmRleGVkT2JqZWN0PWZ1bmN0aW9uKGUpe3JldHVybiBpbmRleGVkT2JqZWN0KHJlcXVpcmVPYmplY3RDb2VyY2libGUoZSkpfSwkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZiQzPWRlc2NyaXB0b3JzPyRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscil7aWYoZT10b0luZGV4ZWRPYmplY3QoZSkscj10b1Byb3BlcnR5S2V5KHIpLGllOERvbURlZmluZSl0cnl7cmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxyKX1jYXRjaChlKXt9aWYoaGFzJDEoZSxyKSlyZXR1cm4gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKCFvYmplY3RQcm9wZXJ0eUlzRW51bWVyYWJsZS5mLmNhbGwoZSxyKSxlW3JdKX0sb2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPXtmOmYkM30sY2VpbD1NYXRoLmNlaWwsZmxvb3IkNz1NYXRoLmZsb29yLHRvSW50ZWdlcj1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZT0rZSk/MDooZT4wP2Zsb29yJDc6Y2VpbCkoZSl9LG1pbiQ2PU1hdGgubWluLHRvTGVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiBlPjA/bWluJDYodG9JbnRlZ2VyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LG1heCQyPU1hdGgubWF4LG1pbiQ1PU1hdGgubWluLHRvQWJzb2x1dGVJbmRleD1mdW5jdGlvbihlLHIpe3ZhciB0PXRvSW50ZWdlcihlKTtyZXR1cm4gdDwwP21heCQyKHQrciwwKTptaW4kNSh0LHIpfSxjcmVhdGVNZXRob2QkNT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocix0LGEpe3ZhciBpLHM9dG9JbmRleGVkT2JqZWN0KHIpLGM9dG9MZW5ndGgocy5sZW5ndGgpLGw9dG9BYnNvbHV0ZUluZGV4KGEsYyk7aWYoZSYmdCE9dCl7Zm9yKDtjPmw7KWlmKChpPXNbbCsrXSkhPWkpcmV0dXJuITB9ZWxzZSBmb3IoO2M+bDtsKyspaWYoKGV8fGwgaW4gcykmJnNbbF09PT10KXJldHVybiBlfHxsfHwwO3JldHVybiFlJiYtMX19LGFycmF5SW5jbHVkZXM9e2luY2x1ZGVzOmNyZWF0ZU1ldGhvZCQ1KCEwKSxpbmRleE9mOmNyZWF0ZU1ldGhvZCQ1KCExKX0saW5kZXhPZj1hcnJheUluY2x1ZGVzLmluZGV4T2Ysb2JqZWN0S2V5c0ludGVybmFsPWZ1bmN0aW9uKGUscil7dmFyIHQsYT10b0luZGV4ZWRPYmplY3QoZSksaT0wLHM9W107Zm9yKHQgaW4gYSkhaGFzJDEoaGlkZGVuS2V5cyQxLHQpJiZoYXMkMShhLHQpJiZzLnB1c2godCk7Zm9yKDtyLmxlbmd0aD5pOyloYXMkMShhLHQ9cltpKytdKSYmKH5pbmRleE9mKHMsdCl8fHMucHVzaCh0KSk7cmV0dXJuIHN9LGVudW1CdWdLZXlzPVtcImNvbnN0cnVjdG9yXCIsXCJoYXNPd25Qcm9wZXJ0eVwiLFwiaXNQcm90b3R5cGVPZlwiLFwicHJvcGVydHlJc0VudW1lcmFibGVcIixcInRvTG9jYWxlU3RyaW5nXCIsXCJ0b1N0cmluZ1wiLFwidmFsdWVPZlwiXSxoaWRkZW5LZXlzPWVudW1CdWdLZXlzLmNvbmNhdChcImxlbmd0aFwiLFwicHJvdG90eXBlXCIpLGYkMj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhlKXtyZXR1cm4gb2JqZWN0S2V5c0ludGVybmFsKGUsaGlkZGVuS2V5cyl9LG9iamVjdEdldE93blByb3BlcnR5TmFtZXM9e2Y6ZiQyfSxmJDE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxvYmplY3RHZXRPd25Qcm9wZXJ0eVN5bWJvbHM9e2Y6ZiQxfSxvd25LZXlzPWdldEJ1aWx0SW4oXCJSZWZsZWN0XCIsXCJvd25LZXlzXCIpfHxmdW5jdGlvbiBvd25LZXlzKGUpe3ZhciByPW9iamVjdEdldE93blByb3BlcnR5TmFtZXMuZihhbk9iamVjdChlKSksdD1vYmplY3RHZXRPd25Qcm9wZXJ0eVN5bWJvbHMuZjtyZXR1cm4gdD9yLmNvbmNhdCh0KGUpKTpyfSxjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzPWZ1bmN0aW9uKGUscil7Zm9yKHZhciB0PW93bktleXMociksYT1vYmplY3REZWZpbmVQcm9wZXJ0eS5mLGk9b2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmYscz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgYz10W3NdO2hhcyQxKGUsYyl8fGEoZSxjLGkocixjKSl9fSxyZXBsYWNlbWVudD0vI3xcXC5wcm90b3R5cGVcXC4vLGlzRm9yY2VkPWZ1bmN0aW9uKGUscil7dmFyIHQ9ZGF0YVtub3JtYWxpemUoZSldO3JldHVybiB0PT1QT0xZRklMTHx8dCE9TkFUSVZFJiYoaXNDYWxsYWJsZShyKT9mYWlscyhyKTohIXIpfSxub3JtYWxpemU9aXNGb3JjZWQubm9ybWFsaXplPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZShyZXBsYWNlbWVudCxcIi5cIikudG9Mb3dlckNhc2UoKX0sZGF0YT1pc0ZvcmNlZC5kYXRhPXt9LE5BVElWRT1pc0ZvcmNlZC5OQVRJVkU9XCJOXCIsUE9MWUZJTEw9aXNGb3JjZWQuUE9MWUZJTEw9XCJQXCIsaXNGb3JjZWRfMT1pc0ZvcmNlZCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMz1vYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZixfZXhwb3J0PWZ1bmN0aW9uKGUscil7dmFyIHQsYSxpLHMsYyxsPWUudGFyZ2V0LHU9ZS5nbG9iYWwscD1lLnN0YXQ7aWYodD11P2dsb2JhbCQxOnA/Z2xvYmFsJDFbbF18fHNldEdsb2JhbChsLHt9KTooZ2xvYmFsJDFbbF18fHt9KS5wcm90b3R5cGUpZm9yKGEgaW4gcil7aWYocz1yW2FdLGk9ZS5ub1RhcmdldEdldD8oYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMyh0LGEpKSYmYy52YWx1ZTp0W2FdLCFpc0ZvcmNlZF8xKHU/YTpsKyhwP1wiLlwiOlwiI1wiKSthLGUuZm9yY2VkKSYmdm9pZCAwIT09aSl7aWYodHlwZW9mIHM9PXR5cGVvZiBpKWNvbnRpbnVlO2NvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMocyxpKX0oZS5zaGFtfHxpJiZpLnNoYW0pJiZjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkocyxcInNoYW1cIiwhMCkscmVkZWZpbmUodCxhLHMsZSl9fSxuYXRpdmVQcm9taXNlQ29uc3RydWN0b3I9Z2xvYmFsJDEuUHJvbWlzZSxyZWRlZmluZUFsbD1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhIGluIHIpcmVkZWZpbmUoZSxhLHJbYV0sdCk7cmV0dXJuIGV9LGFQb3NzaWJsZVByb3RvdHlwZT1mdW5jdGlvbihlKXtpZihcIm9iamVjdFwiPT10eXBlb2YgZXx8aXNDYWxsYWJsZShlKSlyZXR1cm4gZTt0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIrU3RyaW5nKGUpK1wiIGFzIGEgcHJvdG90eXBlXCIpfSxvYmplY3RTZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fChcIl9fcHJvdG9fX1wiaW57fT9mdW5jdGlvbigpe3ZhciBlLHI9ITEsdD17fTt0cnl7KGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLFwiX19wcm90b19fXCIpLnNldCkuY2FsbCh0LFtdKSxyPXQgaW5zdGFuY2VvZiBBcnJheX1jYXRjaChlKXt9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKHQsYSl7cmV0dXJuIGFuT2JqZWN0KHQpLGFQb3NzaWJsZVByb3RvdHlwZShhKSxyP2UuY2FsbCh0LGEpOnQuX19wcm90b19fPWEsdH19KCk6dm9pZCAwKSxkZWZpbmVQcm9wZXJ0eSQ1PW9iamVjdERlZmluZVByb3BlcnR5LmYsVE9fU1RSSU5HX1RBRyQyPXdlbGxLbm93blN5bWJvbChcInRvU3RyaW5nVGFnXCIpLHNldFRvU3RyaW5nVGFnPWZ1bmN0aW9uKGUscix0KXtlJiYhaGFzJDEoZT10P2U6ZS5wcm90b3R5cGUsVE9fU1RSSU5HX1RBRyQyKSYmZGVmaW5lUHJvcGVydHkkNShlLFRPX1NUUklOR19UQUckMix7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnJ9KX0sU1BFQ0lFUyQ2PXdlbGxLbm93blN5bWJvbChcInNwZWNpZXNcIiksc2V0U3BlY2llcz1mdW5jdGlvbihlKXt2YXIgcj1nZXRCdWlsdEluKGUpLHQ9b2JqZWN0RGVmaW5lUHJvcGVydHkuZjtkZXNjcmlwdG9ycyYmciYmIXJbU1BFQ0lFUyQ2XSYmdChyLFNQRUNJRVMkNix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfSxhbkluc3RhbmNlPWZ1bmN0aW9uKGUscix0KXtpZihlIGluc3RhbmNlb2YgcilyZXR1cm4gZTt0aHJvdyBUeXBlRXJyb3IoXCJJbmNvcnJlY3QgXCIrKHQ/dCtcIiBcIjpcIlwiKStcImludm9jYXRpb25cIil9LGl0ZXJhdG9ycz17fSxJVEVSQVRPUiQ4PXdlbGxLbm93blN5bWJvbChcIml0ZXJhdG9yXCIpLEFycmF5UHJvdG90eXBlJDE9QXJyYXkucHJvdG90eXBlLGlzQXJyYXlJdGVyYXRvck1ldGhvZD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKGl0ZXJhdG9ycy5BcnJheT09PWV8fEFycmF5UHJvdG90eXBlJDFbSVRFUkFUT1IkOF09PT1lKX0sZnVuY3Rpb25CaW5kQ29udGV4dD1mdW5jdGlvbihlLHIsdCl7aWYoYUNhbGxhYmxlKGUpLHZvaWQgMD09PXIpcmV0dXJuIGU7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHIpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwocix0KX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbih0LGEpe3JldHVybiBlLmNhbGwocix0LGEpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHQsYSxpKXtyZXR1cm4gZS5jYWxsKHIsdCxhLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShyLGFyZ3VtZW50cyl9fSxJVEVSQVRPUiQ3PXdlbGxLbm93blN5bWJvbChcIml0ZXJhdG9yXCIpLGdldEl0ZXJhdG9yTWV0aG9kPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGdldE1ldGhvZChlLElURVJBVE9SJDcpfHxnZXRNZXRob2QoZSxcIkBAaXRlcmF0b3JcIil8fGl0ZXJhdG9yc1tjbGFzc29mKGUpXX0sZ2V0SXRlcmF0b3I9ZnVuY3Rpb24oZSxyKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPDI/Z2V0SXRlcmF0b3JNZXRob2QoZSk6cjtpZihhQ2FsbGFibGUodCkpcmV0dXJuIGFuT2JqZWN0KHQuY2FsbChlKSk7dGhyb3cgVHlwZUVycm9yKFN0cmluZyhlKStcIiBpcyBub3QgaXRlcmFibGVcIil9LGl0ZXJhdG9yQ2xvc2U9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhLGk7YW5PYmplY3QoZSk7dHJ5e2lmKCEoYT1nZXRNZXRob2QoZSxcInJldHVyblwiKSkpe2lmKFwidGhyb3dcIj09PXIpdGhyb3cgdDtyZXR1cm4gdH1hPWEuY2FsbChlKX1jYXRjaChlKXtpPSEwLGE9ZX1pZihcInRocm93XCI9PT1yKXRocm93IHQ7aWYoaSl0aHJvdyBhO3JldHVybiBhbk9iamVjdChhKSx0fSxSZXN1bHQ9ZnVuY3Rpb24oZSxyKXt0aGlzLnN0b3BwZWQ9ZSx0aGlzLnJlc3VsdD1yfSxpdGVyYXRlPWZ1bmN0aW9uKGUscix0KXt2YXIgYSxpLHMsYyxsLHUscCxkPXQmJnQudGhhdCxoPSEoIXR8fCF0LkFTX0VOVFJJRVMpLHk9ISghdHx8IXQuSVNfSVRFUkFUT1IpLEE9ISghdHx8IXQuSU5URVJSVVBURUQpLGc9ZnVuY3Rpb25CaW5kQ29udGV4dChyLGQsMStoK0EpLHN0b3A9ZnVuY3Rpb24oZSl7cmV0dXJuIGEmJml0ZXJhdG9yQ2xvc2UoYSxcIm5vcm1hbFwiLGUpLG5ldyBSZXN1bHQoITAsZSl9LGNhbGxGbj1mdW5jdGlvbihlKXtyZXR1cm4gaD8oYW5PYmplY3QoZSksQT9nKGVbMF0sZVsxXSxzdG9wKTpnKGVbMF0sZVsxXSkpOkE/ZyhlLHN0b3ApOmcoZSl9O2lmKHkpYT1lO2Vsc2V7aWYoIShpPWdldEl0ZXJhdG9yTWV0aG9kKGUpKSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGUpK1wiIGlzIG5vdCBpdGVyYWJsZVwiKTtpZihpc0FycmF5SXRlcmF0b3JNZXRob2QoaSkpe2ZvcihzPTAsYz10b0xlbmd0aChlLmxlbmd0aCk7Yz5zO3MrKylpZigobD1jYWxsRm4oZVtzXSkpJiZsIGluc3RhbmNlb2YgUmVzdWx0KXJldHVybiBsO3JldHVybiBuZXcgUmVzdWx0KCExKX1hPWdldEl0ZXJhdG9yKGUsaSl9Zm9yKHU9YS5uZXh0OyEocD11LmNhbGwoYSkpLmRvbmU7KXt0cnl7bD1jYWxsRm4ocC52YWx1ZSl9Y2F0Y2goZSl7aXRlcmF0b3JDbG9zZShhLFwidGhyb3dcIixlKX1pZihcIm9iamVjdFwiPT10eXBlb2YgbCYmbCYmbCBpbnN0YW5jZW9mIFJlc3VsdClyZXR1cm4gbH1yZXR1cm4gbmV3IFJlc3VsdCghMSl9LElURVJBVE9SJDY9d2VsbEtub3duU3ltYm9sKFwiaXRlcmF0b3JcIiksU0FGRV9DTE9TSU5HPSExO3RyeXt2YXIgY2FsbGVkPTAsaXRlcmF0b3JXaXRoUmV0dXJuPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFjYWxsZWQrK319LHJldHVybjpmdW5jdGlvbigpe1NBRkVfQ0xPU0lORz0hMH19O2l0ZXJhdG9yV2l0aFJldHVybltJVEVSQVRPUiQ2XT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGl0ZXJhdG9yV2l0aFJldHVybiwoZnVuY3Rpb24oKXt0aHJvdyAyfSkpfWNhdGNoKGUpe312YXIgY2hlY2tDb3JyZWN0bmVzc09mSXRlcmF0aW9uPWZ1bmN0aW9uKGUscil7aWYoIXImJiFTQUZFX0NMT1NJTkcpcmV0dXJuITE7dmFyIHQ9ITE7dHJ5e3ZhciBhPXt9O2FbSVRFUkFUT1IkNl09ZnVuY3Rpb24oKXtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOnQ9ITB9fX19LGUoYSl9Y2F0Y2goZSl7fXJldHVybiB0fSxlbXB0eT1bXSxjb25zdHJ1Y3Q9Z2V0QnVpbHRJbihcIlJlZmxlY3RcIixcImNvbnN0cnVjdFwiKSxjb25zdHJ1Y3RvclJlZ0V4cD0vXlxccyooPzpjbGFzc3xmdW5jdGlvbilcXGIvLGV4ZWM9Y29uc3RydWN0b3JSZWdFeHAuZXhlYyxJTkNPUlJFQ1RfVE9fU1RSSU5HPSFjb25zdHJ1Y3RvclJlZ0V4cC5leGVjKChmdW5jdGlvbigpe30pKSxpc0NvbnN0cnVjdG9yTW9kZXJuPWZ1bmN0aW9uKGUpe2lmKCFpc0NhbGxhYmxlKGUpKXJldHVybiExO3RyeXtyZXR1cm4gY29uc3RydWN0KE9iamVjdCxlbXB0eSxlKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LGlzQ29uc3RydWN0b3JMZWdhY3k9ZnVuY3Rpb24oZSl7aWYoIWlzQ2FsbGFibGUoZSkpcmV0dXJuITE7c3dpdGNoKGNsYXNzb2YoZSkpe2Nhc2VcIkFzeW5jRnVuY3Rpb25cIjpjYXNlXCJHZW5lcmF0b3JGdW5jdGlvblwiOmNhc2VcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIjpyZXR1cm4hMX1yZXR1cm4gSU5DT1JSRUNUX1RPX1NUUklOR3x8ISFleGVjLmNhbGwoY29uc3RydWN0b3JSZWdFeHAsaW5zcGVjdFNvdXJjZShlKSl9LGlzQ29uc3RydWN0b3I9IWNvbnN0cnVjdHx8ZmFpbHMoKGZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJuIGlzQ29uc3RydWN0b3JNb2Rlcm4oaXNDb25zdHJ1Y3Rvck1vZGVybi5jYWxsKXx8IWlzQ29uc3RydWN0b3JNb2Rlcm4oT2JqZWN0KXx8IWlzQ29uc3RydWN0b3JNb2Rlcm4oKGZ1bmN0aW9uKCl7ZT0hMH0pKXx8ZX0pKT9pc0NvbnN0cnVjdG9yTGVnYWN5OmlzQ29uc3RydWN0b3JNb2Rlcm4sYUNvbnN0cnVjdG9yPWZ1bmN0aW9uKGUpe2lmKGlzQ29uc3RydWN0b3IoZSkpcmV0dXJuIGU7dGhyb3cgVHlwZUVycm9yKHRyeVRvU3RyaW5nKGUpK1wiIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpfSxTUEVDSUVTJDU9d2VsbEtub3duU3ltYm9sKFwic3BlY2llc1wiKSxzcGVjaWVzQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSxyKXt2YXIgdCxhPWFuT2JqZWN0KGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1hfHxudWxsPT0odD1hbk9iamVjdChhKVtTUEVDSUVTJDVdKT9yOmFDb25zdHJ1Y3Rvcih0KX0saHRtbD1nZXRCdWlsdEluKFwiZG9jdW1lbnRcIixcImRvY3VtZW50RWxlbWVudFwiKSxlbmdpbmVJc0lvcz0vKD86aXBhZHxpcGhvbmV8aXBvZCkuKmFwcGxld2Via2l0L2kudGVzdChlbmdpbmVVc2VyQWdlbnQpLGVuZ2luZUlzTm9kZT1cInByb2Nlc3NcIj09Y2xhc3NvZlJhdyhnbG9iYWwkMS5wcm9jZXNzKSxzZXQkMT1nbG9iYWwkMS5zZXRJbW1lZGlhdGUsY2xlYXI9Z2xvYmFsJDEuY2xlYXJJbW1lZGlhdGUscHJvY2VzcyQyPWdsb2JhbCQxLnByb2Nlc3MsTWVzc2FnZUNoYW5uZWw9Z2xvYmFsJDEuTWVzc2FnZUNoYW5uZWwsRGlzcGF0Y2g9Z2xvYmFsJDEuRGlzcGF0Y2gsY291bnRlcj0wLHF1ZXVlPXt9LE9OUkVBRFlTVEFURUNIQU5HRT1cIm9ucmVhZHlzdGF0ZWNoYW5nZVwiLGxvY2F0aW9uLGRlZmVyLGNoYW5uZWwscG9ydDt0cnl7bG9jYXRpb249Z2xvYmFsJDEubG9jYXRpb259Y2F0Y2goZSl7fXZhciBydW49ZnVuY3Rpb24oZSl7aWYocXVldWUuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXF1ZXVlW2VdO2RlbGV0ZSBxdWV1ZVtlXSxyKCl9fSxydW5uZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cnVuKGUpfX0sbGlzdGVuZXI9ZnVuY3Rpb24oZSl7cnVuKGUuZGF0YSl9LHBvc3Q9ZnVuY3Rpb24oZSl7Z2xvYmFsJDEucG9zdE1lc3NhZ2UoU3RyaW5nKGUpLGxvY2F0aW9uLnByb3RvY29sK1wiLy9cIitsb2NhdGlvbi5ob3N0KX07c2V0JDEmJmNsZWFyfHwoc2V0JDE9ZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGUpe2Zvcih2YXIgcj1bXSx0PWFyZ3VtZW50cy5sZW5ndGgsYT0xO3Q+YTspci5wdXNoKGFyZ3VtZW50c1thKytdKTtyZXR1cm4gcXVldWVbKytjb3VudGVyXT1mdW5jdGlvbigpeyhpc0NhbGxhYmxlKGUpP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHZvaWQgMCxyKX0sZGVmZXIoY291bnRlciksY291bnRlcn0sY2xlYXI9ZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoZSl7ZGVsZXRlIHF1ZXVlW2VdfSxlbmdpbmVJc05vZGU/ZGVmZXI9ZnVuY3Rpb24oZSl7cHJvY2VzcyQyLm5leHRUaWNrKHJ1bm5lcihlKSl9OkRpc3BhdGNoJiZEaXNwYXRjaC5ub3c/ZGVmZXI9ZnVuY3Rpb24oZSl7RGlzcGF0Y2gubm93KHJ1bm5lcihlKSl9Ok1lc3NhZ2VDaGFubmVsJiYhZW5naW5lSXNJb3M/KGNoYW5uZWw9bmV3IE1lc3NhZ2VDaGFubmVsLHBvcnQ9Y2hhbm5lbC5wb3J0MixjaGFubmVsLnBvcnQxLm9ubWVzc2FnZT1saXN0ZW5lcixkZWZlcj1mdW5jdGlvbkJpbmRDb250ZXh0KHBvcnQucG9zdE1lc3NhZ2UscG9ydCwxKSk6Z2xvYmFsJDEuYWRkRXZlbnRMaXN0ZW5lciYmaXNDYWxsYWJsZShnbG9iYWwkMS5wb3N0TWVzc2FnZSkmJiFnbG9iYWwkMS5pbXBvcnRTY3JpcHRzJiZsb2NhdGlvbiYmXCJmaWxlOlwiIT09bG9jYXRpb24ucHJvdG9jb2wmJiFmYWlscyhwb3N0KT8oZGVmZXI9cG9zdCxnbG9iYWwkMS5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLGxpc3RlbmVyLCExKSk6ZGVmZXI9T05SRUFEWVNUQVRFQ0hBTkdFIGluIGRvY3VtZW50Q3JlYXRlRWxlbWVudChcInNjcmlwdFwiKT9mdW5jdGlvbihlKXtodG1sLmFwcGVuZENoaWxkKGRvY3VtZW50Q3JlYXRlRWxlbWVudChcInNjcmlwdFwiKSlbT05SRUFEWVNUQVRFQ0hBTkdFXT1mdW5jdGlvbigpe2h0bWwucmVtb3ZlQ2hpbGQodGhpcykscnVuKGUpfX06ZnVuY3Rpb24oZSl7c2V0VGltZW91dChydW5uZXIoZSksMCl9KTt2YXIgdGFzayQxPXtzZXQ6c2V0JDEsY2xlYXI6Y2xlYXJ9LGVuZ2luZUlzSW9zUGViYmxlPS9pcGFkfGlwaG9uZXxpcG9kL2kudGVzdChlbmdpbmVVc2VyQWdlbnQpJiZ2b2lkIDAhPT1nbG9iYWwkMS5QZWJibGUsZW5naW5lSXNXZWJvc1dlYmtpdD0vd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KGVuZ2luZVVzZXJBZ2VudCksZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDI9b2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmYsbWFjcm90YXNrPXRhc2skMS5zZXQsTXV0YXRpb25PYnNlcnZlcj1nbG9iYWwkMS5NdXRhdGlvbk9ic2VydmVyfHxnbG9iYWwkMS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLGRvY3VtZW50JDI9Z2xvYmFsJDEuZG9jdW1lbnQscHJvY2VzcyQxPWdsb2JhbCQxLnByb2Nlc3MsUHJvbWlzZSQxPWdsb2JhbCQxLlByb21pc2UscXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yPWdldE93blByb3BlcnR5RGVzY3JpcHRvciQyKGdsb2JhbCQxLFwicXVldWVNaWNyb3Rhc2tcIikscXVldWVNaWNyb3Rhc2s9cXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yJiZxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IudmFsdWUsZmx1c2gsaGVhZCxsYXN0LG5vdGlmeSQxLHRvZ2dsZSxub2RlLHByb21pc2UsdGhlbjtxdWV1ZU1pY3JvdGFza3x8KGZsdXNoPWZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZW5naW5lSXNOb2RlJiYoZT1wcm9jZXNzJDEuZG9tYWluKSYmZS5leGl0KCk7aGVhZDspe3I9aGVhZC5mbixoZWFkPWhlYWQubmV4dDt0cnl7cigpfWNhdGNoKGUpe3Rocm93IGhlYWQ/bm90aWZ5JDEoKTpsYXN0PXZvaWQgMCxlfX1sYXN0PXZvaWQgMCxlJiZlLmVudGVyKCl9LGVuZ2luZUlzSW9zfHxlbmdpbmVJc05vZGV8fGVuZ2luZUlzV2Vib3NXZWJraXR8fCFNdXRhdGlvbk9ic2VydmVyfHwhZG9jdW1lbnQkMj8hZW5naW5lSXNJb3NQZWJibGUmJlByb21pc2UkMSYmUHJvbWlzZSQxLnJlc29sdmU/KHByb21pc2U9UHJvbWlzZSQxLnJlc29sdmUodm9pZCAwKSxwcm9taXNlLmNvbnN0cnVjdG9yPVByb21pc2UkMSx0aGVuPXByb21pc2UudGhlbixub3RpZnkkMT1mdW5jdGlvbigpe3RoZW4uY2FsbChwcm9taXNlLGZsdXNoKX0pOm5vdGlmeSQxPWVuZ2luZUlzTm9kZT9mdW5jdGlvbigpe3Byb2Nlc3MkMS5uZXh0VGljayhmbHVzaCl9OmZ1bmN0aW9uKCl7bWFjcm90YXNrLmNhbGwoZ2xvYmFsJDEsZmx1c2gpfToodG9nZ2xlPSEwLG5vZGU9ZG9jdW1lbnQkMi5jcmVhdGVUZXh0Tm9kZShcIlwiKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLHtjaGFyYWN0ZXJEYXRhOiEwfSksbm90aWZ5JDE9ZnVuY3Rpb24oKXtub2RlLmRhdGE9dG9nZ2xlPSF0b2dnbGV9KSk7dmFyIG1pY3JvdGFzaz1xdWV1ZU1pY3JvdGFza3x8ZnVuY3Rpb24oZSl7dmFyIHI9e2ZuOmUsbmV4dDp2b2lkIDB9O2xhc3QmJihsYXN0Lm5leHQ9ciksaGVhZHx8KGhlYWQ9cixub3RpZnkkMSgpKSxsYXN0PXJ9LFByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKGUpe3ZhciByLHQ7dGhpcy5wcm9taXNlPW5ldyBlKChmdW5jdGlvbihlLGEpe2lmKHZvaWQgMCE9PXJ8fHZvaWQgMCE9PXQpdGhyb3cgVHlwZUVycm9yKFwiQmFkIFByb21pc2UgY29uc3RydWN0b3JcIik7cj1lLHQ9YX0pKSx0aGlzLnJlc29sdmU9YUNhbGxhYmxlKHIpLHRoaXMucmVqZWN0PWFDYWxsYWJsZSh0KX0sZj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KGUpfSxuZXdQcm9taXNlQ2FwYWJpbGl0eSQxPXtmOmZ9LHByb21pc2VSZXNvbHZlPWZ1bmN0aW9uKGUscil7aWYoYW5PYmplY3QoZSksaXNPYmplY3QocikmJnIuY29uc3RydWN0b3I9PT1lKXJldHVybiByO3ZhciB0PW5ld1Byb21pc2VDYXBhYmlsaXR5JDEuZihlKTtyZXR1cm4oMCx0LnJlc29sdmUpKHIpLHQucHJvbWlzZX0saG9zdFJlcG9ydEVycm9ycz1mdW5jdGlvbihlLHIpe3ZhciB0PWdsb2JhbCQxLmNvbnNvbGU7dCYmdC5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP3QuZXJyb3IoZSk6dC5lcnJvcihlLHIpKX0scGVyZm9ybT1mdW5jdGlvbihlKXt0cnl7cmV0dXJue2Vycm9yOiExLHZhbHVlOmUoKX19Y2F0Y2goZSl7cmV0dXJue2Vycm9yOiEwLHZhbHVlOmV9fX0sZW5naW5lSXNCcm93c2VyPVwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3csdGFzaz10YXNrJDEuc2V0LFNQRUNJRVMkND13ZWxsS25vd25TeW1ib2woXCJzcGVjaWVzXCIpLFBST01JU0U9XCJQcm9taXNlXCIsZ2V0SW50ZXJuYWxTdGF0ZSQ0PWludGVybmFsU3RhdGUuZ2V0LHNldEludGVybmFsU3RhdGUkNT1pbnRlcm5hbFN0YXRlLnNldCxnZXRJbnRlcm5hbFByb21pc2VTdGF0ZT1pbnRlcm5hbFN0YXRlLmdldHRlckZvcihQUk9NSVNFKSxOYXRpdmVQcm9taXNlUHJvdG90eXBlPW5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvciYmbmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLnByb3RvdHlwZSxQcm9taXNlQ29uc3RydWN0b3I9bmF0aXZlUHJvbWlzZUNvbnN0cnVjdG9yLFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZT1OYXRpdmVQcm9taXNlUHJvdG90eXBlLFR5cGVFcnJvciQxPWdsb2JhbCQxLlR5cGVFcnJvcixkb2N1bWVudCQxPWdsb2JhbCQxLmRvY3VtZW50LHByb2Nlc3M9Z2xvYmFsJDEucHJvY2VzcyxuZXdQcm9taXNlQ2FwYWJpbGl0eT1uZXdQcm9taXNlQ2FwYWJpbGl0eSQxLmYsbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5PW5ld1Byb21pc2VDYXBhYmlsaXR5LERJU1BBVENIX0VWRU5UPSEhKGRvY3VtZW50JDEmJmRvY3VtZW50JDEuY3JlYXRlRXZlbnQmJmdsb2JhbCQxLmRpc3BhdGNoRXZlbnQpLE5BVElWRV9SRUpFQ1RJT05fRVZFTlQ9aXNDYWxsYWJsZShnbG9iYWwkMS5Qcm9taXNlUmVqZWN0aW9uRXZlbnQpLFVOSEFORExFRF9SRUpFQ1RJT049XCJ1bmhhbmRsZWRyZWplY3Rpb25cIixSRUpFQ1RJT05fSEFORExFRD1cInJlamVjdGlvbmhhbmRsZWRcIixQRU5ESU5HPTAsRlVMRklMTEVEPTEsUkVKRUNURUQ9MixIQU5ETEVEPTEsVU5IQU5ETEVEPTIsU1VCQ0xBU1NJTkc9ITEsSW50ZXJuYWwsT3duUHJvbWlzZUNhcGFiaWxpdHksUHJvbWlzZVdyYXBwZXIsbmF0aXZlVGhlbixGT1JDRUQkNj1pc0ZvcmNlZF8xKFBST01JU0UsKGZ1bmN0aW9uKCl7dmFyIGU9aW5zcGVjdFNvdXJjZShQcm9taXNlQ29uc3RydWN0b3IpLHI9ZSE9PVN0cmluZyhQcm9taXNlQ29uc3RydWN0b3IpO2lmKCFyJiY2Nj09PWVuZ2luZVY4VmVyc2lvbilyZXR1cm4hMDtpZihlbmdpbmVWOFZlcnNpb24+PTUxJiYvbmF0aXZlIGNvZGUvLnRlc3QoZSkpcmV0dXJuITE7dmFyIHQ9bmV3IFByb21pc2VDb25zdHJ1Y3RvcigoZnVuY3Rpb24oZSl7ZSgxKX0pKSxGYWtlUHJvbWlzZT1mdW5jdGlvbihlKXtlKChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07cmV0dXJuKHQuY29uc3RydWN0b3I9e30pW1NQRUNJRVMkNF09RmFrZVByb21pc2UsIShTVUJDTEFTU0lORz10LnRoZW4oKGZ1bmN0aW9uKCl7fSkpaW5zdGFuY2VvZiBGYWtlUHJvbWlzZSl8fCFyJiZlbmdpbmVJc0Jyb3dzZXImJiFOQVRJVkVfUkVKRUNUSU9OX0VWRU5UfSkpLElOQ09SUkVDVF9JVEVSQVRJT049Rk9SQ0VEJDZ8fCFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oKGZ1bmN0aW9uKGUpe1Byb21pc2VDb25zdHJ1Y3Rvci5hbGwoZSkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfSkpLGlzVGhlbmFibGU9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuISghaXNPYmplY3QoZSl8fCFpc0NhbGxhYmxlKHI9ZS50aGVuKSkmJnJ9LG5vdGlmeT1mdW5jdGlvbihlLHIpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciB0PWUucmVhY3Rpb25zO21pY3JvdGFzaygoZnVuY3Rpb24oKXtmb3IodmFyIGE9ZS52YWx1ZSxpPWUuc3RhdGU9PUZVTEZJTExFRCxzPTA7dC5sZW5ndGg+czspe3ZhciBjLGwsdSxwPXRbcysrXSxkPWk/cC5vazpwLmZhaWwsaD1wLnJlc29sdmUseT1wLnJlamVjdCxBPXAuZG9tYWluO3RyeXtkPyhpfHwoZS5yZWplY3Rpb249PT1VTkhBTkRMRUQmJm9uSGFuZGxlVW5oYW5kbGVkKGUpLGUucmVqZWN0aW9uPUhBTkRMRUQpLCEwPT09ZD9jPWE6KEEmJkEuZW50ZXIoKSxjPWQoYSksQSYmKEEuZXhpdCgpLHU9ITApKSxjPT09cC5wcm9taXNlP3koVHlwZUVycm9yJDEoXCJQcm9taXNlLWNoYWluIGN5Y2xlXCIpKToobD1pc1RoZW5hYmxlKGMpKT9sLmNhbGwoYyxoLHkpOmgoYykpOnkoYSl9Y2F0Y2goZSl7QSYmIXUmJkEuZXhpdCgpLHkoZSl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsciYmIWUucmVqZWN0aW9uJiZvblVuaGFuZGxlZChlKX0pKX19LGRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhLGk7RElTUEFUQ0hfRVZFTlQ/KChhPWRvY3VtZW50JDEuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSkucHJvbWlzZT1yLGEucmVhc29uPXQsYS5pbml0RXZlbnQoZSwhMSwhMCksZ2xvYmFsJDEuZGlzcGF0Y2hFdmVudChhKSk6YT17cHJvbWlzZTpyLHJlYXNvbjp0fSwhTkFUSVZFX1JFSkVDVElPTl9FVkVOVCYmKGk9Z2xvYmFsJDFbXCJvblwiK2VdKT9pKGEpOmU9PT1VTkhBTkRMRURfUkVKRUNUSU9OJiZob3N0UmVwb3J0RXJyb3JzKFwiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXCIsdCl9LG9uVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3Rhc2suY2FsbChnbG9iYWwkMSwoZnVuY3Rpb24oKXt2YXIgcix0PWUuZmFjYWRlLGE9ZS52YWx1ZTtpZihpc1VuaGFuZGxlZChlKSYmKHI9cGVyZm9ybSgoZnVuY3Rpb24oKXtlbmdpbmVJc05vZGU/cHJvY2Vzcy5lbWl0KFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsYSx0KTpkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sdCxhKX0pKSxlLnJlamVjdGlvbj1lbmdpbmVJc05vZGV8fGlzVW5oYW5kbGVkKGUpP1VOSEFORExFRDpIQU5ETEVELHIuZXJyb3IpKXRocm93IHIudmFsdWV9KSl9LGlzVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlamVjdGlvbiE9PUhBTkRMRUQmJiFlLnBhcmVudH0sb25IYW5kbGVVbmhhbmRsZWQ9ZnVuY3Rpb24oZSl7dGFzay5jYWxsKGdsb2JhbCQxLChmdW5jdGlvbigpe3ZhciByPWUuZmFjYWRlO2VuZ2luZUlzTm9kZT9wcm9jZXNzLmVtaXQoXCJyZWplY3Rpb25IYW5kbGVkXCIscik6ZGlzcGF0Y2hFdmVudChSRUpFQ1RJT05fSEFORExFRCxyLGUudmFsdWUpfSkpfSxiaW5kPWZ1bmN0aW9uKGUscix0KXtyZXR1cm4gZnVuY3Rpb24oYSl7ZShyLGEsdCl9fSxpbnRlcm5hbFJlamVjdD1mdW5jdGlvbihlLHIsdCl7ZS5kb25lfHwoZS5kb25lPSEwLHQmJihlPXQpLGUudmFsdWU9cixlLnN0YXRlPVJFSkVDVEVELG5vdGlmeShlLCEwKSl9LGludGVybmFsUmVzb2x2ZT1mdW5jdGlvbihlLHIsdCl7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHQmJihlPXQpO3RyeXtpZihlLmZhY2FkZT09PXIpdGhyb3cgVHlwZUVycm9yJDEoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTt2YXIgYT1pc1RoZW5hYmxlKHIpO2E/bWljcm90YXNrKChmdW5jdGlvbigpe3ZhciB0PXtkb25lOiExfTt0cnl7YS5jYWxsKHIsYmluZChpbnRlcm5hbFJlc29sdmUsdCxlKSxiaW5kKGludGVybmFsUmVqZWN0LHQsZSkpfWNhdGNoKHIpe2ludGVybmFsUmVqZWN0KHQscixlKX19KSk6KGUudmFsdWU9cixlLnN0YXRlPUZVTEZJTExFRCxub3RpZnkoZSwhMSkpfWNhdGNoKHIpe2ludGVybmFsUmVqZWN0KHtkb25lOiExfSxyLGUpfX19O2lmKEZPUkNFRCQ2JiYoUHJvbWlzZUNvbnN0cnVjdG9yPWZ1bmN0aW9uIFByb21pc2UoZSl7YW5JbnN0YW5jZSh0aGlzLFByb21pc2VDb25zdHJ1Y3RvcixQUk9NSVNFKSxhQ2FsbGFibGUoZSksSW50ZXJuYWwuY2FsbCh0aGlzKTt2YXIgcj1nZXRJbnRlcm5hbFN0YXRlJDQodGhpcyk7dHJ5e2UoYmluZChpbnRlcm5hbFJlc29sdmUsciksYmluZChpbnRlcm5hbFJlamVjdCxyKSl9Y2F0Y2goZSl7aW50ZXJuYWxSZWplY3QocixlKX19LFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZT1Qcm9taXNlQ29uc3RydWN0b3IucHJvdG90eXBlLEludGVybmFsPWZ1bmN0aW9uIFByb21pc2UoZSl7c2V0SW50ZXJuYWxTdGF0ZSQ1KHRoaXMse3R5cGU6UFJPTUlTRSxkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOlBFTkRJTkcsdmFsdWU6dm9pZCAwfSl9LEludGVybmFsLnByb3RvdHlwZT1yZWRlZmluZUFsbChQcm9taXNlQ29uc3RydWN0b3JQcm90b3R5cGUse3RoZW46ZnVuY3Rpb24gdGhlbihlLHIpe3ZhciB0PWdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpLGE9bmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsUHJvbWlzZUNvbnN0cnVjdG9yKSk7cmV0dXJuIGEub2s9IWlzQ2FsbGFibGUoZSl8fGUsYS5mYWlsPWlzQ2FsbGFibGUocikmJnIsYS5kb21haW49ZW5naW5lSXNOb2RlP3Byb2Nlc3MuZG9tYWluOnZvaWQgMCx0LnBhcmVudD0hMCx0LnJlYWN0aW9ucy5wdXNoKGEpLHQuc3RhdGUhPVBFTkRJTkcmJm5vdGlmeSh0LCExKSxhLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLE93blByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEludGVybmFsLHI9Z2V0SW50ZXJuYWxTdGF0ZSQ0KGUpO3RoaXMucHJvbWlzZT1lLHRoaXMucmVzb2x2ZT1iaW5kKGludGVybmFsUmVzb2x2ZSxyKSx0aGlzLnJlamVjdD1iaW5kKGludGVybmFsUmVqZWN0LHIpfSxuZXdQcm9taXNlQ2FwYWJpbGl0eSQxLmY9bmV3UHJvbWlzZUNhcGFiaWxpdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1Qcm9taXNlQ29uc3RydWN0b3J8fGU9PT1Qcm9taXNlV3JhcHBlcj9uZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoZSk6bmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KGUpfSxpc0NhbGxhYmxlKG5hdGl2ZVByb21pc2VDb25zdHJ1Y3RvcikmJk5hdGl2ZVByb21pc2VQcm90b3R5cGUhPT1PYmplY3QucHJvdG90eXBlKSl7bmF0aXZlVGhlbj1OYXRpdmVQcm9taXNlUHJvdG90eXBlLnRoZW4sU1VCQ0xBU1NJTkd8fChyZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLFwidGhlblwiLChmdW5jdGlvbiB0aGVuKGUscil7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFByb21pc2VDb25zdHJ1Y3RvcigoZnVuY3Rpb24oZSxyKXtuYXRpdmVUaGVuLmNhbGwodCxlLHIpfSkpLnRoZW4oZSxyKX0pLHt1bnNhZmU6ITB9KSxyZWRlZmluZShOYXRpdmVQcm9taXNlUHJvdG90eXBlLFwiY2F0Y2hcIixQcm9taXNlQ29uc3RydWN0b3JQcm90b3R5cGUuY2F0Y2gse3Vuc2FmZTohMH0pKTt0cnl7ZGVsZXRlIE5hdGl2ZVByb21pc2VQcm90b3R5cGUuY29uc3RydWN0b3J9Y2F0Y2goZSl7fW9iamVjdFNldFByb3RvdHlwZU9mJiZvYmplY3RTZXRQcm90b3R5cGVPZihOYXRpdmVQcm9taXNlUHJvdG90eXBlLFByb21pc2VDb25zdHJ1Y3RvclByb3RvdHlwZSl9X2V4cG9ydCh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOkZPUkNFRCQ2fSx7UHJvbWlzZTpQcm9taXNlQ29uc3RydWN0b3J9KSxzZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsUFJPTUlTRSwhMSksc2V0U3BlY2llcyhQUk9NSVNFKSxQcm9taXNlV3JhcHBlcj1nZXRCdWlsdEluKFBST01JU0UpLF9leHBvcnQoe3RhcmdldDpQUk9NSVNFLHN0YXQ6ITAsZm9yY2VkOkZPUkNFRCQ2fSx7cmVqZWN0OmZ1bmN0aW9uIHJlamVjdChlKXt2YXIgcj1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtyZXR1cm4gci5yZWplY3QuY2FsbCh2b2lkIDAsZSksci5wcm9taXNlfX0pLF9leHBvcnQoe3RhcmdldDpQUk9NSVNFLHN0YXQ6ITAsZm9yY2VkOkZPUkNFRCQ2fSx7cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKGUpe3JldHVybiBwcm9taXNlUmVzb2x2ZSh0aGlzLGUpfX0pLF9leHBvcnQoe3RhcmdldDpQUk9NSVNFLHN0YXQ6ITAsZm9yY2VkOklOQ09SUkVDVF9JVEVSQVRJT059LHthbGw6ZnVuY3Rpb24gYWxsKGUpe3ZhciByPXRoaXMsdD1uZXdQcm9taXNlQ2FwYWJpbGl0eShyKSxhPXQucmVzb2x2ZSxpPXQucmVqZWN0LHM9cGVyZm9ybSgoZnVuY3Rpb24oKXt2YXIgdD1hQ2FsbGFibGUoci5yZXNvbHZlKSxzPVtdLGM9MCxsPTE7aXRlcmF0ZShlLChmdW5jdGlvbihlKXt2YXIgdT1jKysscD0hMTtzLnB1c2godm9pZCAwKSxsKyssdC5jYWxsKHIsZSkudGhlbigoZnVuY3Rpb24oZSl7cHx8KHA9ITAsc1t1XT1lLC0tbHx8YShzKSl9KSxpKX0pKSwtLWx8fGEocyl9KSk7cmV0dXJuIHMuZXJyb3ImJmkocy52YWx1ZSksdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uIHJhY2UoZSl7dmFyIHI9dGhpcyx0PW5ld1Byb21pc2VDYXBhYmlsaXR5KHIpLGE9dC5yZWplY3QsaT1wZXJmb3JtKChmdW5jdGlvbigpe3ZhciBpPWFDYWxsYWJsZShyLnJlc29sdmUpO2l0ZXJhdGUoZSwoZnVuY3Rpb24oZSl7aS5jYWxsKHIsZSkudGhlbih0LnJlc29sdmUsYSl9KSl9KSk7cmV0dXJuIGkuZXJyb3ImJmEoaS52YWx1ZSksdC5wcm9taXNlfX0pO3ZhciBpbmhlcml0SWZSZXF1aXJlZD1mdW5jdGlvbihlLHIsdCl7dmFyIGEsaTtyZXR1cm4gb2JqZWN0U2V0UHJvdG90eXBlT2YmJmlzQ2FsbGFibGUoYT1yLmNvbnN0cnVjdG9yKSYmYSE9PXQmJmlzT2JqZWN0KGk9YS5wcm90b3R5cGUpJiZpIT09dC5wcm90b3R5cGUmJm9iamVjdFNldFByb3RvdHlwZU9mKGUsaSksZX0sb2JqZWN0S2V5cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ga2V5cyhlKXtyZXR1cm4gb2JqZWN0S2V5c0ludGVybmFsKGUsZW51bUJ1Z0tleXMpfSxvYmplY3REZWZpbmVQcm9wZXJ0aWVzPWRlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoZSxyKXthbk9iamVjdChlKTtmb3IodmFyIHQsYT1vYmplY3RLZXlzKHIpLGk9YS5sZW5ndGgscz0wO2k+czspb2JqZWN0RGVmaW5lUHJvcGVydHkuZihlLHQ9YVtzKytdLHJbdF0pO3JldHVybiBlfSxHVD1cIj5cIixMVD1cIjxcIixQUk9UT1RZUEUkMT1cInByb3RvdHlwZVwiLFNDUklQVD1cInNjcmlwdFwiLElFX1BST1RPJDE9c2hhcmVkS2V5KFwiSUVfUFJPVE9cIiksRW1wdHlDb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe30sc2NyaXB0VGFnPWZ1bmN0aW9uKGUpe3JldHVybiBMVCtTQ1JJUFQrR1QrZStMVCtcIi9cIitTQ1JJUFQrR1R9LE51bGxQcm90b09iamVjdFZpYUFjdGl2ZVg9ZnVuY3Rpb24oZSl7ZS53cml0ZShzY3JpcHRUYWcoXCJcIikpLGUuY2xvc2UoKTt2YXIgcj1lLnBhcmVudFdpbmRvdy5PYmplY3Q7cmV0dXJuIGU9bnVsbCxyfSxOdWxsUHJvdG9PYmplY3RWaWFJRnJhbWU9ZnVuY3Rpb24oKXt2YXIgZSxyPWRvY3VtZW50Q3JlYXRlRWxlbWVudChcImlmcmFtZVwiKSx0PVwiamF2YVwiK1NDUklQVCtcIjpcIjtyZXR1cm4gci5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGh0bWwuYXBwZW5kQ2hpbGQociksci5zcmM9U3RyaW5nKHQpLChlPXIuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLGUud3JpdGUoc2NyaXB0VGFnKFwiZG9jdW1lbnQuRj1PYmplY3RcIikpLGUuY2xvc2UoKSxlLkZ9LGFjdGl2ZVhEb2N1bWVudCxOdWxsUHJvdG9PYmplY3Q9ZnVuY3Rpb24oKXt0cnl7YWN0aXZlWERvY3VtZW50PW5ldyBBY3RpdmVYT2JqZWN0KFwiaHRtbGZpbGVcIil9Y2F0Y2goZSl7fU51bGxQcm90b09iamVjdD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuZG9tYWluJiZhY3RpdmVYRG9jdW1lbnQ/TnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhY3RpdmVYRG9jdW1lbnQpOk51bGxQcm90b09iamVjdFZpYUlGcmFtZSgpOk51bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYWN0aXZlWERvY3VtZW50KTtmb3IodmFyIGU9ZW51bUJ1Z0tleXMubGVuZ3RoO2UtLTspZGVsZXRlIE51bGxQcm90b09iamVjdFtQUk9UT1RZUEUkMV1bZW51bUJ1Z0tleXNbZV1dO3JldHVybiBOdWxsUHJvdG9PYmplY3QoKX07aGlkZGVuS2V5cyQxW0lFX1BST1RPJDFdPSEwO3ZhciBvYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24gY3JlYXRlKGUscil7dmFyIHQ7cmV0dXJuIG51bGwhPT1lPyhFbXB0eUNvbnN0cnVjdG9yW1BST1RPVFlQRSQxXT1hbk9iamVjdChlKSx0PW5ldyBFbXB0eUNvbnN0cnVjdG9yLEVtcHR5Q29uc3RydWN0b3JbUFJPVE9UWVBFJDFdPW51bGwsdFtJRV9QUk9UTyQxXT1lKTp0PU51bGxQcm90b09iamVjdCgpLHZvaWQgMD09PXI/dDpvYmplY3REZWZpbmVQcm9wZXJ0aWVzKHQscil9LHRvU3RyaW5nPWZ1bmN0aW9uKGUpe2lmKFwiU3ltYm9sXCI9PT1jbGFzc29mKGUpKXRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IGEgU3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nXCIpO3JldHVybiBTdHJpbmcoZSl9LHdoaXRlc3BhY2VzPVwiXFx0XFxuXFx2XFxmXFxyIMKg4ZqA4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXFx1MjAyOFxcdTIwMjlcXHVmZWZmXCIsd2hpdGVzcGFjZT1cIltcIit3aGl0ZXNwYWNlcytcIl1cIixsdHJpbT1SZWdFeHAoXCJeXCIrd2hpdGVzcGFjZSt3aGl0ZXNwYWNlK1wiKlwiKSxydHJpbT1SZWdFeHAod2hpdGVzcGFjZSt3aGl0ZXNwYWNlK1wiKiRcIiksY3JlYXRlTWV0aG9kJDQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciB0PXRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUocikpO3JldHVybiAxJmUmJih0PXQucmVwbGFjZShsdHJpbSxcIlwiKSksMiZlJiYodD10LnJlcGxhY2UocnRyaW0sXCJcIikpLHR9fSxzdHJpbmdUcmltPXtzdGFydDpjcmVhdGVNZXRob2QkNCgxKSxlbmQ6Y3JlYXRlTWV0aG9kJDQoMiksdHJpbTpjcmVhdGVNZXRob2QkNCgzKX0sZ2V0T3duUHJvcGVydHlOYW1lcyQxPW9iamVjdEdldE93blByb3BlcnR5TmFtZXMuZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMT1vYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZixkZWZpbmVQcm9wZXJ0eSQ0PW9iamVjdERlZmluZVByb3BlcnR5LmYsdHJpbT1zdHJpbmdUcmltLnRyaW0sTlVNQkVSPVwiTnVtYmVyXCIsTmF0aXZlTnVtYmVyPWdsb2JhbCQxW05VTUJFUl0sTnVtYmVyUHJvdG90eXBlPU5hdGl2ZU51bWJlci5wcm90b3R5cGUsQlJPS0VOX0NMQVNTT0Y9Y2xhc3NvZlJhdyhvYmplY3RDcmVhdGUoTnVtYmVyUHJvdG90eXBlKSk9PU5VTUJFUix0b051bWJlcj1mdW5jdGlvbihlKXtpZihpc1N5bWJvbChlKSl0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgY29udmVydCBhIFN5bWJvbCB2YWx1ZSB0byBhIG51bWJlclwiKTt2YXIgcix0LGEsaSxzLGMsbCx1LHA9dG9QcmltaXRpdmUoZSxcIm51bWJlclwiKTtpZihcInN0cmluZ1wiPT10eXBlb2YgcCYmcC5sZW5ndGg+MilpZig0Mz09PShyPShwPXRyaW0ocCkpLmNoYXJDb2RlQXQoMCkpfHw0NT09PXIpe2lmKDg4PT09KHQ9cC5jaGFyQ29kZUF0KDIpKXx8MTIwPT09dClyZXR1cm4gTmFOfWVsc2UgaWYoNDg9PT1yKXtzd2l0Y2gocC5jaGFyQ29kZUF0KDEpKXtjYXNlIDY2OmNhc2UgOTg6YT0yLGk9NDk7YnJlYWs7Y2FzZSA3OTpjYXNlIDExMTphPTgsaT01NTticmVhaztkZWZhdWx0OnJldHVybitwfWZvcihjPShzPXAuc2xpY2UoMikpLmxlbmd0aCxsPTA7bDxjO2wrKylpZigodT1zLmNoYXJDb2RlQXQobCkpPDQ4fHx1PmkpcmV0dXJuIE5hTjtyZXR1cm4gcGFyc2VJbnQocyxhKX1yZXR1cm4rcH07aWYoaXNGb3JjZWRfMShOVU1CRVIsIU5hdGl2ZU51bWJlcihcIiAwbzFcIil8fCFOYXRpdmVOdW1iZXIoXCIwYjFcIil8fE5hdGl2ZU51bWJlcihcIisweDFcIikpKXtmb3IodmFyIE51bWJlcldyYXBwZXI9ZnVuY3Rpb24gTnVtYmVyKGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg8MT8wOmUsdD10aGlzO3JldHVybiB0IGluc3RhbmNlb2YgTnVtYmVyV3JhcHBlciYmKEJST0tFTl9DTEFTU09GP2ZhaWxzKChmdW5jdGlvbigpe051bWJlclByb3RvdHlwZS52YWx1ZU9mLmNhbGwodCl9KSk6Y2xhc3NvZlJhdyh0KSE9TlVNQkVSKT9pbmhlcml0SWZSZXF1aXJlZChuZXcgTmF0aXZlTnVtYmVyKHRvTnVtYmVyKHIpKSx0LE51bWJlcldyYXBwZXIpOnRvTnVtYmVyKHIpfSxrZXlzJDE9ZGVzY3JpcHRvcnM/Z2V0T3duUHJvcGVydHlOYW1lcyQxKE5hdGl2ZU51bWJlcik6XCJNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSxFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcixmcm9tU3RyaW5nLHJhbmdlXCIuc3BsaXQoXCIsXCIpLGokMT0wLGtleSQxO2tleXMkMS5sZW5ndGg+aiQxO2okMSsrKWhhcyQxKE5hdGl2ZU51bWJlcixrZXkkMT1rZXlzJDFbaiQxXSkmJiFoYXMkMShOdW1iZXJXcmFwcGVyLGtleSQxKSYmZGVmaW5lUHJvcGVydHkkNChOdW1iZXJXcmFwcGVyLGtleSQxLGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxKE5hdGl2ZU51bWJlcixrZXkkMSkpO051bWJlcldyYXBwZXIucHJvdG90eXBlPU51bWJlclByb3RvdHlwZSxOdW1iZXJQcm90b3R5cGUuY29uc3RydWN0b3I9TnVtYmVyV3JhcHBlcixyZWRlZmluZShnbG9iYWwkMSxOVU1CRVIsTnVtYmVyV3JhcHBlcil9dmFyIEZVTkNUSU9OX05BTUVfRVhJU1RTPWZ1bmN0aW9uTmFtZS5FWElTVFMsZGVmaW5lUHJvcGVydHkkMz1vYmplY3REZWZpbmVQcm9wZXJ0eS5mLEZ1bmN0aW9uUHJvdG90eXBlPUZ1bmN0aW9uLnByb3RvdHlwZSxGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nPUZ1bmN0aW9uUHJvdG90eXBlLnRvU3RyaW5nLG5hbWVSRT0vXlxccypmdW5jdGlvbiAoW14gKF0qKS8sTkFNRSQxPVwibmFtZVwiO2Rlc2NyaXB0b3JzJiYhRlVOQ1RJT05fTkFNRV9FWElTVFMmJmRlZmluZVByb3BlcnR5JDMoRnVuY3Rpb25Qcm90b3R5cGUsTkFNRSQxLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBGdW5jdGlvblByb3RvdHlwZVRvU3RyaW5nLmNhbGwodGhpcykubWF0Y2gobmFtZVJFKVsxXX1jYXRjaChlKXtyZXR1cm5cIlwifX19KSxfZXhwb3J0KHtnbG9iYWw6ITB9LHtnbG9iYWxUaGlzOmdsb2JhbCQxfSk7dmFyICRhc3NpZ249T2JqZWN0LmFzc2lnbixkZWZpbmVQcm9wZXJ0eSQyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxvYmplY3RBc3NpZ249ISRhc3NpZ258fGZhaWxzKChmdW5jdGlvbigpe2lmKGRlc2NyaXB0b3JzJiYxIT09JGFzc2lnbih7YjoxfSwkYXNzaWduKGRlZmluZVByb3BlcnR5JDIoe30sXCJhXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7ZGVmaW5lUHJvcGVydHkkMih0aGlzLFwiYlwiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIGU9e30scj17fSx0PVN5bWJvbCgpO3JldHVybiBlW3RdPTcsXCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiLnNwbGl0KFwiXCIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JbZV09ZX0pKSw3IT0kYXNzaWduKHt9LGUpW3RdfHxcImFiY2RlZmdoaWprbG1ub3BxcnN0XCIhPW9iamVjdEtleXMoJGFzc2lnbih7fSxyKSkuam9pbihcIlwiKX0pKT9mdW5jdGlvbiBhc3NpZ24oZSxyKXtmb3IodmFyIHQ9dG9PYmplY3QoZSksYT1hcmd1bWVudHMubGVuZ3RoLGk9MSxzPW9iamVjdEdldE93blByb3BlcnR5U3ltYm9scy5mLGM9b2JqZWN0UHJvcGVydHlJc0VudW1lcmFibGUuZjthPmk7KWZvcih2YXIgbCx1PWluZGV4ZWRPYmplY3QoYXJndW1lbnRzW2krK10pLHA9cz9vYmplY3RLZXlzKHUpLmNvbmNhdChzKHUpKTpvYmplY3RLZXlzKHUpLGQ9cC5sZW5ndGgsaD0wO2Q+aDspbD1wW2grK10sZGVzY3JpcHRvcnMmJiFjLmNhbGwodSxsKXx8KHRbbF09dVtsXSk7cmV0dXJuIHR9OiRhc3NpZ247X2V4cG9ydCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PW9iamVjdEFzc2lnbn0se2Fzc2lnbjpvYmplY3RBc3NpZ259KTt2YXIgcGF0aD1nbG9iYWwkMTtwYXRoLk9iamVjdC5hc3NpZ247dmFyIHJlZ2V4cEZsYWdzPWZ1bmN0aW9uKCl7dmFyIGU9YW5PYmplY3QodGhpcykscj1cIlwiO3JldHVybiBlLmdsb2JhbCYmKHIrPVwiZ1wiKSxlLmlnbm9yZUNhc2UmJihyKz1cImlcIiksZS5tdWx0aWxpbmUmJihyKz1cIm1cIiksZS5kb3RBbGwmJihyKz1cInNcIiksZS51bmljb2RlJiYocis9XCJ1XCIpLGUuc3RpY2t5JiYocis9XCJ5XCIpLHJ9LCRSZWdFeHAkMj1nbG9iYWwkMS5SZWdFeHAsVU5TVVBQT1JURURfWSQyPWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPSRSZWdFeHAkMihcImFcIixcInlcIik7cmV0dXJuIGUubGFzdEluZGV4PTIsbnVsbCE9ZS5leGVjKFwiYWJjZFwiKX0pKSxCUk9LRU5fQ0FSRVQ9ZmFpbHMoKGZ1bmN0aW9uKCl7dmFyIGU9JFJlZ0V4cCQyKFwiXnJcIixcImd5XCIpO3JldHVybiBlLmxhc3RJbmRleD0yLG51bGwhPWUuZXhlYyhcInN0clwiKX0pKSxyZWdleHBTdGlja3lIZWxwZXJzPXtVTlNVUFBPUlRFRF9ZOlVOU1VQUE9SVEVEX1kkMixCUk9LRU5fQ0FSRVQ6QlJPS0VOX0NBUkVUfSwkUmVnRXhwJDE9Z2xvYmFsJDEuUmVnRXhwLHJlZ2V4cFVuc3VwcG9ydGVkRG90QWxsPWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPSRSZWdFeHAkMShcIi5cIixcInNcIik7cmV0dXJuIShlLmRvdEFsbCYmZS5leGVjKFwiXFxuXCIpJiZcInNcIj09PWUuZmxhZ3MpfSkpLCRSZWdFeHA9Z2xvYmFsJDEuUmVnRXhwLHJlZ2V4cFVuc3VwcG9ydGVkTmNnPWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPSRSZWdFeHAoXCIoPzxhPmIpXCIsXCJnXCIpO3JldHVyblwiYlwiIT09ZS5leGVjKFwiYlwiKS5ncm91cHMuYXx8XCJiY1wiIT09XCJiXCIucmVwbGFjZShlLFwiJDxhPmNcIil9KSksZ2V0SW50ZXJuYWxTdGF0ZSQzPWludGVybmFsU3RhdGUuZ2V0LG5hdGl2ZUV4ZWM9UmVnRXhwLnByb3RvdHlwZS5leGVjLG5hdGl2ZVJlcGxhY2U9c2hhcmVkKFwibmF0aXZlLXN0cmluZy1yZXBsYWNlXCIsU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKSxwYXRjaGVkRXhlYz1uYXRpdmVFeGVjLFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORz0ocmUxPS9hLyxyZTI9L2IqL2csbmF0aXZlRXhlYy5jYWxsKHJlMSxcImFcIiksbmF0aXZlRXhlYy5jYWxsKHJlMixcImFcIiksMCE9PXJlMS5sYXN0SW5kZXh8fDAhPT1yZTIubGFzdEluZGV4KSxyZTEscmUyLFVOU1VQUE9SVEVEX1kkMT1yZWdleHBTdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1l8fHJlZ2V4cFN0aWNreUhlbHBlcnMuQlJPS0VOX0NBUkVULE5QQ0dfSU5DTFVERUQ9dm9pZCAwIT09LygpPz8vLmV4ZWMoXCJcIilbMV0sUEFUQ0g9VVBEQVRFU19MQVNUX0lOREVYX1dST05HfHxOUENHX0lOQ0xVREVEfHxVTlNVUFBPUlRFRF9ZJDF8fHJlZ2V4cFVuc3VwcG9ydGVkRG90QWxsfHxyZWdleHBVbnN1cHBvcnRlZE5jZztQQVRDSCYmKHBhdGNoZWRFeGVjPWZ1bmN0aW9uIGV4ZWMoZSl7dmFyIHIsdCxhLGkscyxjLGwsdT10aGlzLHA9Z2V0SW50ZXJuYWxTdGF0ZSQzKHUpLGQ9dG9TdHJpbmcoZSksaD1wLnJhdztpZihoKXJldHVybiBoLmxhc3RJbmRleD11Lmxhc3RJbmRleCxyPXBhdGNoZWRFeGVjLmNhbGwoaCxkKSx1Lmxhc3RJbmRleD1oLmxhc3RJbmRleCxyO3ZhciB5PXAuZ3JvdXBzLEE9VU5TVVBQT1JURURfWSQxJiZ1LnN0aWNreSxnPXJlZ2V4cEZsYWdzLmNhbGwodSksdj11LnNvdXJjZSxFPTAsbT1kO2lmKEEmJigtMT09PShnPWcucmVwbGFjZShcInlcIixcIlwiKSkuaW5kZXhPZihcImdcIikmJihnKz1cImdcIiksbT1kLnNsaWNlKHUubGFzdEluZGV4KSx1Lmxhc3RJbmRleD4wJiYoIXUubXVsdGlsaW5lfHx1Lm11bHRpbGluZSYmXCJcXG5cIiE9PWQuY2hhckF0KHUubGFzdEluZGV4LTEpKSYmKHY9XCIoPzogXCIrditcIilcIixtPVwiIFwiK20sRSsrKSx0PW5ldyBSZWdFeHAoXCJeKD86XCIrditcIilcIixnKSksTlBDR19JTkNMVURFRCYmKHQ9bmV3IFJlZ0V4cChcIl5cIit2K1wiJCg/IVxcXFxzKVwiLGcpKSxVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcmJihhPXUubGFzdEluZGV4KSxpPW5hdGl2ZUV4ZWMuY2FsbChBP3Q6dSxtKSxBP2k/KGkuaW5wdXQ9aS5pbnB1dC5zbGljZShFKSxpWzBdPWlbMF0uc2xpY2UoRSksaS5pbmRleD11Lmxhc3RJbmRleCx1Lmxhc3RJbmRleCs9aVswXS5sZW5ndGgpOnUubGFzdEluZGV4PTA6VVBEQVRFU19MQVNUX0lOREVYX1dST05HJiZpJiYodS5sYXN0SW5kZXg9dS5nbG9iYWw/aS5pbmRleCtpWzBdLmxlbmd0aDphKSxOUENHX0lOQ0xVREVEJiZpJiZpLmxlbmd0aD4xJiZuYXRpdmVSZXBsYWNlLmNhbGwoaVswXSx0LChmdW5jdGlvbigpe2ZvcihzPTE7czxhcmd1bWVudHMubGVuZ3RoLTI7cysrKXZvaWQgMD09PWFyZ3VtZW50c1tzXSYmKGlbc109dm9pZCAwKX0pKSxpJiZ5KWZvcihpLmdyb3Vwcz1jPW9iamVjdENyZWF0ZShudWxsKSxzPTA7czx5Lmxlbmd0aDtzKyspY1sobD15W3NdKVswXV09aVtsWzFdXTtyZXR1cm4gaX0pO3ZhciByZWdleHBFeGVjPXBhdGNoZWRFeGVjO19leHBvcnQoe3RhcmdldDpcIlJlZ0V4cFwiLHByb3RvOiEwLGZvcmNlZDovLi8uZXhlYyE9PXJlZ2V4cEV4ZWN9LHtleGVjOnJlZ2V4cEV4ZWN9KTt2YXIgU1BFQ0lFUyQzPXdlbGxLbm93blN5bWJvbChcInNwZWNpZXNcIiksUmVnRXhwUHJvdG90eXBlJDE9UmVnRXhwLnByb3RvdHlwZSxmaXhSZWdleHBXZWxsS25vd25TeW1ib2xMb2dpYz1mdW5jdGlvbihlLHIsdCxhKXt2YXIgaT13ZWxsS25vd25TeW1ib2woZSkscz0hZmFpbHMoKGZ1bmN0aW9uKCl7dmFyIHI9e307cmV0dXJuIHJbaV09ZnVuY3Rpb24oKXtyZXR1cm4gN30sNyE9XCJcIltlXShyKX0pKSxjPXMmJiFmYWlscygoZnVuY3Rpb24oKXt2YXIgcj0hMSx0PS9hLztyZXR1cm5cInNwbGl0XCI9PT1lJiYoKHQ9e30pLmNvbnN0cnVjdG9yPXt9LHQuY29uc3RydWN0b3JbU1BFQ0lFUyQzXT1mdW5jdGlvbigpe3JldHVybiB0fSx0LmZsYWdzPVwiXCIsdFtpXT0vLi9baV0pLHQuZXhlYz1mdW5jdGlvbigpe3JldHVybiByPSEwLG51bGx9LHRbaV0oXCJcIiksIXJ9KSk7aWYoIXN8fCFjfHx0KXt2YXIgbD0vLi9baV0sdT1yKGksXCJcIltlXSwoZnVuY3Rpb24oZSxyLHQsYSxpKXt2YXIgYz1yLmV4ZWM7cmV0dXJuIGM9PT1yZWdleHBFeGVjfHxjPT09UmVnRXhwUHJvdG90eXBlJDEuZXhlYz9zJiYhaT97ZG9uZTohMCx2YWx1ZTpsLmNhbGwocix0LGEpfTp7ZG9uZTohMCx2YWx1ZTplLmNhbGwodCxyLGEpfTp7ZG9uZTohMX19KSk7cmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSxlLHVbMF0pLHJlZGVmaW5lKFJlZ0V4cFByb3RvdHlwZSQxLGksdVsxXSl9YSYmY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KFJlZ0V4cFByb3RvdHlwZSQxW2ldLFwic2hhbVwiLCEwKX0sTUFUQ0gkMT13ZWxsS25vd25TeW1ib2woXCJtYXRjaFwiKSxpc1JlZ2V4cD1mdW5jdGlvbihlKXt2YXIgcjtyZXR1cm4gaXNPYmplY3QoZSkmJih2b2lkIDAhPT0ocj1lW01BVENIJDFdKT8hIXI6XCJSZWdFeHBcIj09Y2xhc3NvZlJhdyhlKSl9LGNyZWF0ZU1ldGhvZCQzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyLHQpe3ZhciBhLGkscz10b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHIpKSxjPXRvSW50ZWdlcih0KSxsPXMubGVuZ3RoO3JldHVybiBjPDB8fGM+PWw/ZT9cIlwiOnZvaWQgMDooYT1zLmNoYXJDb2RlQXQoYykpPDU1Mjk2fHxhPjU2MzE5fHxjKzE9PT1sfHwoaT1zLmNoYXJDb2RlQXQoYysxKSk8NTYzMjB8fGk+NTczNDM/ZT9zLmNoYXJBdChjKTphOmU/cy5zbGljZShjLGMrMik6aS01NjMyMCsoYS01NTI5Njw8MTApKzY1NTM2fX0sc3RyaW5nTXVsdGlieXRlPXtjb2RlQXQ6Y3JlYXRlTWV0aG9kJDMoITEpLGNoYXJBdDpjcmVhdGVNZXRob2QkMyghMCl9LGNoYXJBdCQxPXN0cmluZ011bHRpYnl0ZS5jaGFyQXQsYWR2YW5jZVN0cmluZ0luZGV4PWZ1bmN0aW9uKGUscix0KXtyZXR1cm4gcisodD9jaGFyQXQkMShlLHIpLmxlbmd0aDoxKX0scmVnZXhwRXhlY0Fic3RyYWN0PWZ1bmN0aW9uKGUscil7dmFyIHQ9ZS5leGVjO2lmKGlzQ2FsbGFibGUodCkpe3ZhciBhPXQuY2FsbChlLHIpO3JldHVybiBudWxsIT09YSYmYW5PYmplY3QoYSksYX1pZihcIlJlZ0V4cFwiPT09Y2xhc3NvZlJhdyhlKSlyZXR1cm4gcmVnZXhwRXhlYy5jYWxsKGUscik7dGhyb3cgVHlwZUVycm9yKFwiUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlclwiKX0sVU5TVVBQT1JURURfWT1yZWdleHBTdGlja3lIZWxwZXJzLlVOU1VQUE9SVEVEX1ksYXJyYXlQdXNoPVtdLnB1c2gsbWluJDQ9TWF0aC5taW4sTUFYX1VJTlQzMj00Mjk0OTY3Mjk1LFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQz0hZmFpbHMoKGZ1bmN0aW9uKCl7dmFyIGU9Lyg/OikvLHI9ZS5leGVjO2UuZXhlYz1mdW5jdGlvbigpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dmFyIHQ9XCJhYlwiLnNwbGl0KGUpO3JldHVybiAyIT09dC5sZW5ndGh8fFwiYVwiIT09dFswXXx8XCJiXCIhPT10WzFdfSkpO2ZpeFJlZ2V4cFdlbGxLbm93blN5bWJvbExvZ2ljKFwic3BsaXRcIiwoZnVuY3Rpb24oZSxyLHQpe3ZhciBhO3JldHVybiBhPVwiY1wiPT1cImFiYmNcIi5zcGxpdCgvKGIpKi8pWzFdfHw0IT1cInRlc3RcIi5zcGxpdCgvKD86KS8sLTEpLmxlbmd0aHx8MiE9XCJhYlwiLnNwbGl0KC8oPzphYikqLykubGVuZ3RofHw0IT1cIi5cIi5zcGxpdCgvKC4/KSguPykvKS5sZW5ndGh8fFwiLlwiLnNwbGl0KC8oKSgpLykubGVuZ3RoPjF8fFwiXCIuc3BsaXQoLy4/LykubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7dmFyIGE9dG9TdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSksaT12b2lkIDA9PT10P01BWF9VSU5UMzI6dD4+PjA7aWYoMD09PWkpcmV0dXJuW107aWYodm9pZCAwPT09ZSlyZXR1cm5bYV07aWYoIWlzUmVnZXhwKGUpKXJldHVybiByLmNhbGwoYSxlLGkpO2Zvcih2YXIgcyxjLGwsdT1bXSxwPShlLmlnbm9yZUNhc2U/XCJpXCI6XCJcIikrKGUubXVsdGlsaW5lP1wibVwiOlwiXCIpKyhlLnVuaWNvZGU/XCJ1XCI6XCJcIikrKGUuc3RpY2t5P1wieVwiOlwiXCIpLGQ9MCxoPW5ldyBSZWdFeHAoZS5zb3VyY2UscCtcImdcIik7KHM9cmVnZXhwRXhlYy5jYWxsKGgsYSkpJiYhKChjPWgubGFzdEluZGV4KT5kJiYodS5wdXNoKGEuc2xpY2UoZCxzLmluZGV4KSkscy5sZW5ndGg+MSYmcy5pbmRleDxhLmxlbmd0aCYmYXJyYXlQdXNoLmFwcGx5KHUscy5zbGljZSgxKSksbD1zWzBdLmxlbmd0aCxkPWMsdS5sZW5ndGg+PWkpKTspaC5sYXN0SW5kZXg9PT1zLmluZGV4JiZoLmxhc3RJbmRleCsrO3JldHVybiBkPT09YS5sZW5ndGg/IWwmJmgudGVzdChcIlwiKXx8dS5wdXNoKFwiXCIpOnUucHVzaChhLnNsaWNlKGQpKSx1Lmxlbmd0aD5pP3Uuc2xpY2UoMCxpKTp1fTpcIjBcIi5zcGxpdCh2b2lkIDAsMCkubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJjA9PT10P1tdOnIuY2FsbCh0aGlzLGUsdCl9OnIsW2Z1bmN0aW9uIHNwbGl0KHIsdCl7dmFyIGk9cmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGlzKSxzPW51bGw9PXI/dm9pZCAwOmdldE1ldGhvZChyLGUpO3JldHVybiBzP3MuY2FsbChyLGksdCk6YS5jYWxsKHRvU3RyaW5nKGkpLHIsdCl9LGZ1bmN0aW9uKGUsaSl7dmFyIHM9YW5PYmplY3QodGhpcyksYz10b1N0cmluZyhlKSxsPXQoYSxzLGMsaSxhIT09cik7aWYobC5kb25lKXJldHVybiBsLnZhbHVlO3ZhciB1PXNwZWNpZXNDb25zdHJ1Y3RvcihzLFJlZ0V4cCkscD1zLnVuaWNvZGUsZD0ocy5pZ25vcmVDYXNlP1wiaVwiOlwiXCIpKyhzLm11bHRpbGluZT9cIm1cIjpcIlwiKSsocy51bmljb2RlP1widVwiOlwiXCIpKyhVTlNVUFBPUlRFRF9ZP1wiZ1wiOlwieVwiKSxoPW5ldyB1KFVOU1VQUE9SVEVEX1k/XCJeKD86XCIrcy5zb3VyY2UrXCIpXCI6cyxkKSx5PXZvaWQgMD09PWk/TUFYX1VJTlQzMjppPj4+MDtpZigwPT09eSlyZXR1cm5bXTtpZigwPT09Yy5sZW5ndGgpcmV0dXJuIG51bGw9PT1yZWdleHBFeGVjQWJzdHJhY3QoaCxjKT9bY106W107Zm9yKHZhciBBPTAsZz0wLHY9W107ZzxjLmxlbmd0aDspe2gubGFzdEluZGV4PVVOU1VQUE9SVEVEX1k/MDpnO3ZhciBFLG09cmVnZXhwRXhlY0Fic3RyYWN0KGgsVU5TVVBQT1JURURfWT9jLnNsaWNlKGcpOmMpO2lmKG51bGw9PT1tfHwoRT1taW4kNCh0b0xlbmd0aChoLmxhc3RJbmRleCsoVU5TVVBQT1JURURfWT9nOjApKSxjLmxlbmd0aCkpPT09QSlnPWFkdmFuY2VTdHJpbmdJbmRleChjLGcscCk7ZWxzZXtpZih2LnB1c2goYy5zbGljZShBLGcpKSx2Lmxlbmd0aD09PXkpcmV0dXJuIHY7Zm9yKHZhciBJPTE7STw9bS5sZW5ndGgtMTtJKyspaWYodi5wdXNoKG1bSV0pLHYubGVuZ3RoPT09eSlyZXR1cm4gdjtnPUE9RX19cmV0dXJuIHYucHVzaChjLnNsaWNlKEEpKSx2fV19KSwhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDLFVOU1VQUE9SVEVEX1kpLGZpeFJlZ2V4cFdlbGxLbm93blN5bWJvbExvZ2ljKFwibWF0Y2hcIiwoZnVuY3Rpb24oZSxyLHQpe3JldHVybltmdW5jdGlvbiBtYXRjaChyKXt2YXIgdD1yZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpLGE9bnVsbD09cj92b2lkIDA6Z2V0TWV0aG9kKHIsZSk7cmV0dXJuIGE/YS5jYWxsKHIsdCk6bmV3IFJlZ0V4cChyKVtlXSh0b1N0cmluZyh0KSl9LGZ1bmN0aW9uKGUpe3ZhciBhPWFuT2JqZWN0KHRoaXMpLGk9dG9TdHJpbmcoZSkscz10KHIsYSxpKTtpZihzLmRvbmUpcmV0dXJuIHMudmFsdWU7aWYoIWEuZ2xvYmFsKXJldHVybiByZWdleHBFeGVjQWJzdHJhY3QoYSxpKTt2YXIgYz1hLnVuaWNvZGU7YS5sYXN0SW5kZXg9MDtmb3IodmFyIGwsdT1bXSxwPTA7bnVsbCE9PShsPXJlZ2V4cEV4ZWNBYnN0cmFjdChhLGkpKTspe3ZhciBkPXRvU3RyaW5nKGxbMF0pO3VbcF09ZCxcIlwiPT09ZCYmKGEubGFzdEluZGV4PWFkdmFuY2VTdHJpbmdJbmRleChpLHRvTGVuZ3RoKGEubGFzdEluZGV4KSxjKSkscCsrfXJldHVybiAwPT09cD9udWxsOnV9XX0pKTt2YXIgVU5TQ09QQUJMRVM9d2VsbEtub3duU3ltYm9sKFwidW5zY29wYWJsZXNcIiksQXJyYXlQcm90b3R5cGU9QXJyYXkucHJvdG90eXBlO251bGw9PUFycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXSYmb2JqZWN0RGVmaW5lUHJvcGVydHkuZihBcnJheVByb3RvdHlwZSxVTlNDT1BBQkxFUyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOm9iamVjdENyZWF0ZShudWxsKX0pO3ZhciBhZGRUb1Vuc2NvcGFibGVzPWZ1bmN0aW9uKGUpe0FycmF5UHJvdG90eXBlW1VOU0NPUEFCTEVTXVtlXT0hMH0sY29ycmVjdFByb3RvdHlwZUdldHRlcj0hZmFpbHMoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gRigpe31yZXR1cm4gRi5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbCxPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IEYpIT09Ri5wcm90b3R5cGV9KSksSUVfUFJPVE89c2hhcmVkS2V5KFwiSUVfUFJPVE9cIiksT2JqZWN0UHJvdG90eXBlJDI9T2JqZWN0LnByb3RvdHlwZSxvYmplY3RHZXRQcm90b3R5cGVPZj1jb3JyZWN0UHJvdG90eXBlR2V0dGVyP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXt2YXIgcj10b09iamVjdChlKTtpZihoYXMkMShyLElFX1BST1RPKSlyZXR1cm4gcltJRV9QUk9UT107dmFyIHQ9ci5jb25zdHJ1Y3RvcjtyZXR1cm4gaXNDYWxsYWJsZSh0KSYmciBpbnN0YW5jZW9mIHQ/dC5wcm90b3R5cGU6ciBpbnN0YW5jZW9mIE9iamVjdD9PYmplY3RQcm90b3R5cGUkMjpudWxsfSxJVEVSQVRPUiQ1PXdlbGxLbm93blN5bWJvbChcIml0ZXJhdG9yXCIpLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlMkMT0hMSxJdGVyYXRvclByb3RvdHlwZSQyLFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSxhcnJheUl0ZXJhdG9yO1tdLmtleXMmJihhcnJheUl0ZXJhdG9yPVtdLmtleXMoKSxcIm5leHRcImluIGFycmF5SXRlcmF0b3I/KFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZT1vYmplY3RHZXRQcm90b3R5cGVPZihvYmplY3RHZXRQcm90b3R5cGVPZihhcnJheUl0ZXJhdG9yKSksUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlIT09T2JqZWN0LnByb3RvdHlwZSYmKEl0ZXJhdG9yUHJvdG90eXBlJDI9UHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlKSk6QlVHR1lfU0FGQVJJX0lURVJBVE9SUyQxPSEwKTt2YXIgTkVXX0lURVJBVE9SX1BST1RPVFlQRT1udWxsPT1JdGVyYXRvclByb3RvdHlwZSQyfHxmYWlscygoZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4gSXRlcmF0b3JQcm90b3R5cGUkMltJVEVSQVRPUiQ1XS5jYWxsKGUpIT09ZX0pKTtORVdfSVRFUkFUT1JfUFJPVE9UWVBFJiYoSXRlcmF0b3JQcm90b3R5cGUkMj17fSksaXNDYWxsYWJsZShJdGVyYXRvclByb3RvdHlwZSQyW0lURVJBVE9SJDVdKXx8cmVkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUkMixJVEVSQVRPUiQ1LChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpO3ZhciBpdGVyYXRvcnNDb3JlPXtJdGVyYXRvclByb3RvdHlwZTpJdGVyYXRvclByb3RvdHlwZSQyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6QlVHR1lfU0FGQVJJX0lURVJBVE9SUyQxfSxJdGVyYXRvclByb3RvdHlwZSQxPWl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGUscmV0dXJuVGhpcyQxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhPXIrXCIgSXRlcmF0b3JcIjtyZXR1cm4gZS5wcm90b3R5cGU9b2JqZWN0Q3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlJDEse25leHQ6Y3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsdCl9KSxzZXRUb1N0cmluZ1RhZyhlLGEsITEpLGl0ZXJhdG9yc1thXT1yZXR1cm5UaGlzJDEsZX0sUFJPUEVSX0ZVTkNUSU9OX05BTUUkMz1mdW5jdGlvbk5hbWUuUFJPUEVSLENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FJDE9ZnVuY3Rpb25OYW1lLkNPTkZJR1VSQUJMRSxJdGVyYXRvclByb3RvdHlwZT1pdGVyYXRvcnNDb3JlLkl0ZXJhdG9yUHJvdG90eXBlLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM9aXRlcmF0b3JzQ29yZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLElURVJBVE9SJDQ9d2VsbEtub3duU3ltYm9sKFwiaXRlcmF0b3JcIiksS0VZUz1cImtleXNcIixWQUxVRVM9XCJ2YWx1ZXNcIixFTlRSSUVTPVwiZW50cmllc1wiLHJldHVyblRoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGVmaW5lSXRlcmF0b3I9ZnVuY3Rpb24oZSxyLHQsYSxpLHMsYyl7Y3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3Rvcih0LHIsYSk7dmFyIGwsdSxwLGdldEl0ZXJhdGlvbk1ldGhvZD1mdW5jdGlvbihlKXtpZihlPT09aSYmZylyZXR1cm4gZztpZighQlVHR1lfU0FGQVJJX0lURVJBVE9SUyYmZSBpbiB5KXJldHVybiB5W2VdO3N3aXRjaChlKXtjYXNlIEtFWVM6cmV0dXJuIGZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IHQodGhpcyxlKX07Y2FzZSBWQUxVRVM6cmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiBuZXcgdCh0aGlzLGUpfTtjYXNlIEVOVFJJRVM6cmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gbmV3IHQodGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0KHRoaXMpfX0sZD1yK1wiIEl0ZXJhdG9yXCIsaD0hMSx5PWUucHJvdG90eXBlLEE9eVtJVEVSQVRPUiQ0XXx8eVtcIkBAaXRlcmF0b3JcIl18fGkmJnlbaV0sZz0hQlVHR1lfU0FGQVJJX0lURVJBVE9SUyYmQXx8Z2V0SXRlcmF0aW9uTWV0aG9kKGkpLHY9XCJBcnJheVwiPT1yJiZ5LmVudHJpZXN8fEE7aWYodiYmKGw9b2JqZWN0R2V0UHJvdG90eXBlT2Yodi5jYWxsKG5ldyBlKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmbC5uZXh0JiYob2JqZWN0R2V0UHJvdG90eXBlT2YobCkhPT1JdGVyYXRvclByb3RvdHlwZSYmKG9iamVjdFNldFByb3RvdHlwZU9mP29iamVjdFNldFByb3RvdHlwZU9mKGwsSXRlcmF0b3JQcm90b3R5cGUpOmlzQ2FsbGFibGUobFtJVEVSQVRPUiQ0XSl8fHJlZGVmaW5lKGwsSVRFUkFUT1IkNCxyZXR1cm5UaGlzKSksc2V0VG9TdHJpbmdUYWcobCxkLCEwKSksUFJPUEVSX0ZVTkNUSU9OX05BTUUkMyYmaT09VkFMVUVTJiZBJiZBLm5hbWUhPT1WQUxVRVMmJihDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSQxP2NyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSh5LFwibmFtZVwiLFZBTFVFUyk6KGg9ITAsZz1mdW5jdGlvbiB2YWx1ZXMoKXtyZXR1cm4gQS5jYWxsKHRoaXMpfSkpLGkpaWYodT17dmFsdWVzOmdldEl0ZXJhdGlvbk1ldGhvZChWQUxVRVMpLGtleXM6cz9nOmdldEl0ZXJhdGlvbk1ldGhvZChLRVlTKSxlbnRyaWVzOmdldEl0ZXJhdGlvbk1ldGhvZChFTlRSSUVTKX0sYylmb3IocCBpbiB1KShCVUdHWV9TQUZBUklfSVRFUkFUT1JTfHxofHwhKHAgaW4geSkpJiZyZWRlZmluZSh5LHAsdVtwXSk7ZWxzZSBfZXhwb3J0KHt0YXJnZXQ6cixwcm90bzohMCxmb3JjZWQ6QlVHR1lfU0FGQVJJX0lURVJBVE9SU3x8aH0sdSk7cmV0dXJuIHlbSVRFUkFUT1IkNF0hPT1nJiZyZWRlZmluZSh5LElURVJBVE9SJDQsZyx7bmFtZTppfSksaXRlcmF0b3JzW3JdPWcsdX0sQVJSQVlfSVRFUkFUT1I9XCJBcnJheSBJdGVyYXRvclwiLHNldEludGVybmFsU3RhdGUkND1pbnRlcm5hbFN0YXRlLnNldCxnZXRJbnRlcm5hbFN0YXRlJDI9aW50ZXJuYWxTdGF0ZS5nZXR0ZXJGb3IoQVJSQVlfSVRFUkFUT1IpLGVzX2FycmF5X2l0ZXJhdG9yPWRlZmluZUl0ZXJhdG9yKEFycmF5LFwiQXJyYXlcIiwoZnVuY3Rpb24oZSxyKXtzZXRJbnRlcm5hbFN0YXRlJDQodGhpcyx7dHlwZTpBUlJBWV9JVEVSQVRPUix0YXJnZXQ6dG9JbmRleGVkT2JqZWN0KGUpLGluZGV4OjAsa2luZDpyfSl9KSwoZnVuY3Rpb24oKXt2YXIgZT1nZXRJbnRlcm5hbFN0YXRlJDIodGhpcykscj1lLnRhcmdldCx0PWUua2luZCxhPWUuaW5kZXgrKztyZXR1cm4hcnx8YT49ci5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCx7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KTpcImtleXNcIj09dD97dmFsdWU6YSxkb25lOiExfTpcInZhbHVlc1wiPT10P3t2YWx1ZTpyW2FdLGRvbmU6ITF9Ont2YWx1ZTpbYSxyW2FdXSxkb25lOiExfX0pLFwidmFsdWVzXCIpO2l0ZXJhdG9ycy5Bcmd1bWVudHM9aXRlcmF0b3JzLkFycmF5LGFkZFRvVW5zY29wYWJsZXMoXCJrZXlzXCIpLGFkZFRvVW5zY29wYWJsZXMoXCJ2YWx1ZXNcIiksYWRkVG9VbnNjb3BhYmxlcyhcImVudHJpZXNcIik7dmFyIGFycmF5QnVmZmVyTmF0aXZlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIERhdGFWaWV3LGRlZmluZVByb3BlcnR5JDE9b2JqZWN0RGVmaW5lUHJvcGVydHkuZixJbnQ4QXJyYXkkMz1nbG9iYWwkMS5JbnQ4QXJyYXksSW50OEFycmF5UHJvdG90eXBlPUludDhBcnJheSQzJiZJbnQ4QXJyYXkkMy5wcm90b3R5cGUsVWludDhDbGFtcGVkQXJyYXk9Z2xvYmFsJDEuVWludDhDbGFtcGVkQXJyYXksVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGU9VWludDhDbGFtcGVkQXJyYXkmJlVpbnQ4Q2xhbXBlZEFycmF5LnByb3RvdHlwZSxUeXBlZEFycmF5PUludDhBcnJheSQzJiZvYmplY3RHZXRQcm90b3R5cGVPZihJbnQ4QXJyYXkkMyksVHlwZWRBcnJheVByb3RvdHlwZT1JbnQ4QXJyYXlQcm90b3R5cGUmJm9iamVjdEdldFByb3RvdHlwZU9mKEludDhBcnJheVByb3RvdHlwZSksT2JqZWN0UHJvdG90eXBlJDE9T2JqZWN0LnByb3RvdHlwZSxpc1Byb3RvdHlwZU9mPU9iamVjdFByb3RvdHlwZSQxLmlzUHJvdG90eXBlT2YsVE9fU1RSSU5HX1RBRyQxPXdlbGxLbm93blN5bWJvbChcInRvU3RyaW5nVGFnXCIpLFRZUEVEX0FSUkFZX1RBRz11aWQoXCJUWVBFRF9BUlJBWV9UQUdcIiksVFlQRURfQVJSQVlfQ09OU1RSVUNUT1IkMT11aWQoXCJUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUlwiKSxOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJDE9YXJyYXlCdWZmZXJOYXRpdmUmJiEhb2JqZWN0U2V0UHJvdG90eXBlT2YmJlwiT3BlcmFcIiE9PWNsYXNzb2YoZ2xvYmFsJDEub3BlcmEpLFRZUEVEX0FSUkFZX1RBR19SRVFJUkVEPSExLE5BTUUsQ29uc3RydWN0b3IsUHJvdG90eXBlLFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0PXtJbnQ4QXJyYXk6MSxVaW50OEFycmF5OjEsVWludDhDbGFtcGVkQXJyYXk6MSxJbnQxNkFycmF5OjIsVWludDE2QXJyYXk6MixJbnQzMkFycmF5OjQsVWludDMyQXJyYXk6NCxGbG9hdDMyQXJyYXk6NCxGbG9hdDY0QXJyYXk6OH0sQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0PXtCaWdJbnQ2NEFycmF5OjgsQmlnVWludDY0QXJyYXk6OH0saXNWaWV3PWZ1bmN0aW9uIGlzVmlldyhlKXtpZighaXNPYmplY3QoZSkpcmV0dXJuITE7dmFyIHI9Y2xhc3NvZihlKTtyZXR1cm5cIkRhdGFWaWV3XCI9PT1yfHxoYXMkMShUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdCxyKXx8aGFzJDEoQmlnSW50QXJyYXlDb25zdHJ1Y3RvcnNMaXN0LHIpfSxpc1R5cGVkQXJyYXk9ZnVuY3Rpb24oZSl7aWYoIWlzT2JqZWN0KGUpKXJldHVybiExO3ZhciByPWNsYXNzb2YoZSk7cmV0dXJuIGhhcyQxKFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0LHIpfHxoYXMkMShCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3Qscil9LGFUeXBlZEFycmF5JG09ZnVuY3Rpb24oZSl7aWYoaXNUeXBlZEFycmF5KGUpKXJldHVybiBlO3Rocm93IFR5cGVFcnJvcihcIlRhcmdldCBpcyBub3QgYSB0eXBlZCBhcnJheVwiKX0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciQyPWZ1bmN0aW9uKGUpe2lmKGlzQ2FsbGFibGUoZSkmJighb2JqZWN0U2V0UHJvdG90eXBlT2Z8fGlzUHJvdG90eXBlT2YuY2FsbChUeXBlZEFycmF5LGUpKSlyZXR1cm4gZTt0aHJvdyBUeXBlRXJyb3IodHJ5VG9TdHJpbmcoZSkrXCIgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3JcIil9LGV4cG9ydFR5cGVkQXJyYXlNZXRob2Qkbj1mdW5jdGlvbihlLHIsdCl7aWYoZGVzY3JpcHRvcnMpe2lmKHQpZm9yKHZhciBhIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KXt2YXIgaT1nbG9iYWwkMVthXTtpZihpJiZoYXMkMShpLnByb3RvdHlwZSxlKSl0cnl7ZGVsZXRlIGkucHJvdG90eXBlW2VdfWNhdGNoKGUpe319VHlwZWRBcnJheVByb3RvdHlwZVtlXSYmIXR8fHJlZGVmaW5lKFR5cGVkQXJyYXlQcm90b3R5cGUsZSx0P3I6TkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyQxJiZJbnQ4QXJyYXlQcm90b3R5cGVbZV18fHIpfX0sZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZD1mdW5jdGlvbihlLHIsdCl7dmFyIGEsaTtpZihkZXNjcmlwdG9ycyl7aWYob2JqZWN0U2V0UHJvdG90eXBlT2Ype2lmKHQpZm9yKGEgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpaWYoKGk9Z2xvYmFsJDFbYV0pJiZoYXMkMShpLGUpKXRyeXtkZWxldGUgaVtlXX1jYXRjaChlKXt9aWYoVHlwZWRBcnJheVtlXSYmIXQpcmV0dXJuO3RyeXtyZXR1cm4gcmVkZWZpbmUoVHlwZWRBcnJheSxlLHQ/cjpOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJDEmJlR5cGVkQXJyYXlbZV18fHIpfWNhdGNoKGUpe319Zm9yKGEgaW4gVHlwZWRBcnJheUNvbnN0cnVjdG9yc0xpc3QpIShpPWdsb2JhbCQxW2FdKXx8aVtlXSYmIXR8fHJlZGVmaW5lKGksZSxyKX19O2ZvcihOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KUNvbnN0cnVjdG9yPWdsb2JhbCQxW05BTUVdLFByb3RvdHlwZT1Db25zdHJ1Y3RvciYmQ29uc3RydWN0b3IucHJvdG90eXBlLFByb3RvdHlwZT9jcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUHJvdG90eXBlLFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SJDEsQ29uc3RydWN0b3IpOk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MkMT0hMTtmb3IoTkFNRSBpbiBCaWdJbnRBcnJheUNvbnN0cnVjdG9yc0xpc3QpQ29uc3RydWN0b3I9Z2xvYmFsJDFbTkFNRV0sUHJvdG90eXBlPUNvbnN0cnVjdG9yJiZDb25zdHJ1Y3Rvci5wcm90b3R5cGUsUHJvdG90eXBlJiZjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUHJvdG90eXBlLFRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SJDEsQ29uc3RydWN0b3IpO2lmKCghTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyQxfHwhaXNDYWxsYWJsZShUeXBlZEFycmF5KXx8VHlwZWRBcnJheT09PUZ1bmN0aW9uLnByb3RvdHlwZSkmJihUeXBlZEFycmF5PWZ1bmN0aW9uIFR5cGVkQXJyYXkoKXt0aHJvdyBUeXBlRXJyb3IoXCJJbmNvcnJlY3QgaW52b2NhdGlvblwiKX0sTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyQxKSlmb3IoTkFNRSBpbiBUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdClnbG9iYWwkMVtOQU1FXSYmb2JqZWN0U2V0UHJvdG90eXBlT2YoZ2xvYmFsJDFbTkFNRV0sVHlwZWRBcnJheSk7aWYoKCFOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJDF8fCFUeXBlZEFycmF5UHJvdG90eXBlfHxUeXBlZEFycmF5UHJvdG90eXBlPT09T2JqZWN0UHJvdG90eXBlJDEpJiYoVHlwZWRBcnJheVByb3RvdHlwZT1UeXBlZEFycmF5LnByb3RvdHlwZSxOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJDEpKWZvcihOQU1FIGluIFR5cGVkQXJyYXlDb25zdHJ1Y3RvcnNMaXN0KWdsb2JhbCQxW05BTUVdJiZvYmplY3RTZXRQcm90b3R5cGVPZihnbG9iYWwkMVtOQU1FXS5wcm90b3R5cGUsVHlwZWRBcnJheVByb3RvdHlwZSk7aWYoTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyQxJiZvYmplY3RHZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSkhPT1UeXBlZEFycmF5UHJvdG90eXBlJiZvYmplY3RTZXRQcm90b3R5cGVPZihVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSxUeXBlZEFycmF5UHJvdG90eXBlKSxkZXNjcmlwdG9ycyYmIWhhcyQxKFR5cGVkQXJyYXlQcm90b3R5cGUsVE9fU1RSSU5HX1RBRyQxKSlmb3IoTkFNRSBpbiBUWVBFRF9BUlJBWV9UQUdfUkVRSVJFRD0hMCxkZWZpbmVQcm9wZXJ0eSQxKFR5cGVkQXJyYXlQcm90b3R5cGUsVE9fU1RSSU5HX1RBRyQxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaXNPYmplY3QodGhpcyk/dGhpc1tUWVBFRF9BUlJBWV9UQUddOnZvaWQgMH19KSxUeXBlZEFycmF5Q29uc3RydWN0b3JzTGlzdClnbG9iYWwkMVtOQU1FXSYmY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGdsb2JhbCQxW05BTUVdLFRZUEVEX0FSUkFZX1RBRyxOQU1FKTt2YXIgYXJyYXlCdWZmZXJWaWV3Q29yZT17TkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUzpOQVRJVkVfQVJSQVlfQlVGRkVSX1ZJRVdTJDEsVFlQRURfQVJSQVlfQ09OU1RSVUNUT1I6VFlQRURfQVJSQVlfQ09OU1RSVUNUT1IkMSxUWVBFRF9BUlJBWV9UQUc6VFlQRURfQVJSQVlfVEFHX1JFUUlSRUQmJlRZUEVEX0FSUkFZX1RBRyxhVHlwZWRBcnJheTphVHlwZWRBcnJheSRtLGFUeXBlZEFycmF5Q29uc3RydWN0b3I6YVR5cGVkQXJyYXlDb25zdHJ1Y3RvciQyLGV4cG9ydFR5cGVkQXJyYXlNZXRob2Q6ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRuLGV4cG9ydFR5cGVkQXJyYXlTdGF0aWNNZXRob2Q6ZXhwb3J0VHlwZWRBcnJheVN0YXRpY01ldGhvZCxpc1ZpZXc6aXNWaWV3LGlzVHlwZWRBcnJheTppc1R5cGVkQXJyYXksVHlwZWRBcnJheTpUeXBlZEFycmF5LFR5cGVkQXJyYXlQcm90b3R5cGU6VHlwZWRBcnJheVByb3RvdHlwZX0sTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUz1hcnJheUJ1ZmZlclZpZXdDb3JlLk5BVElWRV9BUlJBWV9CVUZGRVJfVklFV1MsQXJyYXlCdWZmZXIkMT1nbG9iYWwkMS5BcnJheUJ1ZmZlcixJbnQ4QXJyYXkkMj1nbG9iYWwkMS5JbnQ4QXJyYXksdHlwZWRBcnJheUNvbnN0cnVjdG9yc1JlcXVpcmVXcmFwcGVycz0hTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXU3x8IWZhaWxzKChmdW5jdGlvbigpe0ludDhBcnJheSQyKDEpfSkpfHwhZmFpbHMoKGZ1bmN0aW9uKCl7bmV3IEludDhBcnJheSQyKC0xKX0pKXx8IWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbigoZnVuY3Rpb24oZSl7bmV3IEludDhBcnJheSQyLG5ldyBJbnQ4QXJyYXkkMihudWxsKSxuZXcgSW50OEFycmF5JDIoMS41KSxuZXcgSW50OEFycmF5JDIoZSl9KSwhMCl8fGZhaWxzKChmdW5jdGlvbigpe3JldHVybiAxIT09bmV3IEludDhBcnJheSQyKG5ldyBBcnJheUJ1ZmZlciQxKDIpLDEsdm9pZCAwKS5sZW5ndGh9KSksdG9JbmRleD1mdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXJldHVybiAwO3ZhciByPXRvSW50ZWdlcihlKSx0PXRvTGVuZ3RoKHIpO2lmKHIhPT10KXRocm93IFJhbmdlRXJyb3IoXCJXcm9uZyBsZW5ndGggb3IgaW5kZXhcIik7cmV0dXJuIHR9LGFicz1NYXRoLmFicyxwb3ckMT1NYXRoLnBvdyxmbG9vciQ2PU1hdGguZmxvb3IsbG9nPU1hdGgubG9nLExOMj1NYXRoLkxOMixwYWNrPWZ1bmN0aW9uKGUscix0KXt2YXIgYSxpLHMsYz1uZXcgQXJyYXkodCksbD04KnQtci0xLHU9KDE8PGwpLTEscD11Pj4xLGQ9MjM9PT1yP3BvdyQxKDIsLTI0KS1wb3ckMSgyLC03Nyk6MCxoPWU8MHx8MD09PWUmJjEvZTwwPzE6MCx5PTA7Zm9yKChlPWFicyhlKSkhPWV8fGU9PT0xLzA/KGk9ZSE9ZT8xOjAsYT11KTooYT1mbG9vciQ2KGxvZyhlKS9MTjIpLGUqKHM9cG93JDEoMiwtYSkpPDEmJihhLS0scyo9MiksKGUrPWErcD49MT9kL3M6ZCpwb3ckMSgyLDEtcCkpKnM+PTImJihhKysscy89MiksYStwPj11PyhpPTAsYT11KTphK3A+PTE/KGk9KGUqcy0xKSpwb3ckMSgyLHIpLGErPXApOihpPWUqcG93JDEoMixwLTEpKnBvdyQxKDIsciksYT0wKSk7cj49ODtjW3krK109MjU1JmksaS89MjU2LHItPTgpO2ZvcihhPWE8PHJ8aSxsKz1yO2w+MDtjW3krK109MjU1JmEsYS89MjU2LGwtPTgpO3JldHVybiBjWy0teV18PTEyOCpoLGN9LHVucGFjaz1mdW5jdGlvbihlLHIpe3ZhciB0LGE9ZS5sZW5ndGgsaT04KmEtci0xLHM9KDE8PGkpLTEsYz1zPj4xLGw9aS03LHU9YS0xLHA9ZVt1LS1dLGQ9MTI3JnA7Zm9yKHA+Pj03O2w+MDtkPTI1NipkK2VbdV0sdS0tLGwtPTgpO2Zvcih0PWQmKDE8PC1sKS0xLGQ+Pj0tbCxsKz1yO2w+MDt0PTI1Nip0K2VbdV0sdS0tLGwtPTgpO2lmKDA9PT1kKWQ9MS1jO2Vsc2V7aWYoZD09PXMpcmV0dXJuIHQ/TmFOOnA/LTEvMDoxLzA7dCs9cG93JDEoMixyKSxkLT1jfXJldHVybihwPy0xOjEpKnQqcG93JDEoMixkLXIpfSxpZWVlNzU0PXtwYWNrOnBhY2ssdW5wYWNrOnVucGFja30sYXJyYXlGaWxsPWZ1bmN0aW9uIGZpbGwoZSl7Zm9yKHZhciByPXRvT2JqZWN0KHRoaXMpLHQ9dG9MZW5ndGgoci5sZW5ndGgpLGE9YXJndW1lbnRzLmxlbmd0aCxpPXRvQWJzb2x1dGVJbmRleChhPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx0KSxzPWE+Mj9hcmd1bWVudHNbMl06dm9pZCAwLGM9dm9pZCAwPT09cz90OnRvQWJzb2x1dGVJbmRleChzLHQpO2M+aTspcltpKytdPWU7cmV0dXJuIHJ9LGdldE93blByb3BlcnR5TmFtZXM9b2JqZWN0R2V0T3duUHJvcGVydHlOYW1lcy5mLGRlZmluZVByb3BlcnR5PW9iamVjdERlZmluZVByb3BlcnR5LmYsUFJPUEVSX0ZVTkNUSU9OX05BTUUkMj1mdW5jdGlvbk5hbWUuUFJPUEVSLENPTkZJR1VSQUJMRV9GVU5DVElPTl9OQU1FPWZ1bmN0aW9uTmFtZS5DT05GSUdVUkFCTEUsZ2V0SW50ZXJuYWxTdGF0ZSQxPWludGVybmFsU3RhdGUuZ2V0LHNldEludGVybmFsU3RhdGUkMz1pbnRlcm5hbFN0YXRlLnNldCxBUlJBWV9CVUZGRVI9XCJBcnJheUJ1ZmZlclwiLERBVEFfVklFVz1cIkRhdGFWaWV3XCIsUFJPVE9UWVBFPVwicHJvdG90eXBlXCIsV1JPTkdfTEVOR1RIPVwiV3JvbmcgbGVuZ3RoXCIsV1JPTkdfSU5ERVg9XCJXcm9uZyBpbmRleFwiLE5hdGl2ZUFycmF5QnVmZmVyPWdsb2JhbCQxW0FSUkFZX0JVRkZFUl0sJEFycmF5QnVmZmVyPU5hdGl2ZUFycmF5QnVmZmVyLCREYXRhVmlldz1nbG9iYWwkMVtEQVRBX1ZJRVddLCREYXRhVmlld1Byb3RvdHlwZT0kRGF0YVZpZXcmJiREYXRhVmlld1tQUk9UT1RZUEVdLE9iamVjdFByb3RvdHlwZT1PYmplY3QucHJvdG90eXBlLFJhbmdlRXJyb3IkMT1nbG9iYWwkMS5SYW5nZUVycm9yLHBhY2tJRUVFNzU0PWllZWU3NTQucGFjayx1bnBhY2tJRUVFNzU0PWllZWU3NTQudW5wYWNrLHBhY2tJbnQ4PWZ1bmN0aW9uKGUpe3JldHVyblsyNTUmZV19LHBhY2tJbnQxNj1mdW5jdGlvbihlKXtyZXR1cm5bMjU1JmUsZT4+OCYyNTVdfSxwYWNrSW50MzI9ZnVuY3Rpb24oZSl7cmV0dXJuWzI1NSZlLGU+PjgmMjU1LGU+PjE2JjI1NSxlPj4yNCYyNTVdfSx1bnBhY2tJbnQzMj1mdW5jdGlvbihlKXtyZXR1cm4gZVszXTw8MjR8ZVsyXTw8MTZ8ZVsxXTw8OHxlWzBdfSxwYWNrRmxvYXQzMj1mdW5jdGlvbihlKXtyZXR1cm4gcGFja0lFRUU3NTQoZSwyMyw0KX0scGFja0Zsb2F0NjQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHBhY2tJRUVFNzU0KGUsNTIsOCl9LGFkZEdldHRlcj1mdW5jdGlvbihlLHIpe2RlZmluZVByb3BlcnR5KGVbUFJPVE9UWVBFXSxyLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0SW50ZXJuYWxTdGF0ZSQxKHRoaXMpW3JdfX0pfSxnZXQ9ZnVuY3Rpb24oZSxyLHQsYSl7dmFyIGk9dG9JbmRleCh0KSxzPWdldEludGVybmFsU3RhdGUkMShlKTtpZihpK3I+cy5ieXRlTGVuZ3RoKXRocm93IFJhbmdlRXJyb3IkMShXUk9OR19JTkRFWCk7dmFyIGM9Z2V0SW50ZXJuYWxTdGF0ZSQxKHMuYnVmZmVyKS5ieXRlcyxsPWkrcy5ieXRlT2Zmc2V0LHU9Yy5zbGljZShsLGwrcik7cmV0dXJuIGE/dTp1LnJldmVyc2UoKX0sc2V0PWZ1bmN0aW9uKGUscix0LGEsaSxzKXt2YXIgYz10b0luZGV4KHQpLGw9Z2V0SW50ZXJuYWxTdGF0ZSQxKGUpO2lmKGMrcj5sLmJ5dGVMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvciQxKFdST05HX0lOREVYKTtmb3IodmFyIHU9Z2V0SW50ZXJuYWxTdGF0ZSQxKGwuYnVmZmVyKS5ieXRlcyxwPWMrbC5ieXRlT2Zmc2V0LGQ9YSgraSksaD0wO2g8cjtoKyspdVtwK2hdPWRbcz9oOnItaC0xXX07aWYoYXJyYXlCdWZmZXJOYXRpdmUpe3ZhciBJTkNPUlJFQ1RfQVJSQVlfQlVGRkVSX05BTUU9UFJPUEVSX0ZVTkNUSU9OX05BTUUkMiYmTmF0aXZlQXJyYXlCdWZmZXIubmFtZSE9PUFSUkFZX0JVRkZFUjtpZihmYWlscygoZnVuY3Rpb24oKXtOYXRpdmVBcnJheUJ1ZmZlcigxKX0pKSYmZmFpbHMoKGZ1bmN0aW9uKCl7bmV3IE5hdGl2ZUFycmF5QnVmZmVyKC0xKX0pKSYmIWZhaWxzKChmdW5jdGlvbigpe3JldHVybiBuZXcgTmF0aXZlQXJyYXlCdWZmZXIsbmV3IE5hdGl2ZUFycmF5QnVmZmVyKDEuNSksbmV3IE5hdGl2ZUFycmF5QnVmZmVyKE5hTiksSU5DT1JSRUNUX0FSUkFZX0JVRkZFUl9OQU1FJiYhQ09ORklHVVJBQkxFX0ZVTkNUSU9OX05BTUV9KSkpSU5DT1JSRUNUX0FSUkFZX0JVRkZFUl9OQU1FJiZDT05GSUdVUkFCTEVfRlVOQ1RJT05fTkFNRSYmY3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KE5hdGl2ZUFycmF5QnVmZmVyLFwibmFtZVwiLEFSUkFZX0JVRkZFUik7ZWxzZXskQXJyYXlCdWZmZXI9ZnVuY3Rpb24gQXJyYXlCdWZmZXIoZSl7cmV0dXJuIGFuSW5zdGFuY2UodGhpcywkQXJyYXlCdWZmZXIpLG5ldyBOYXRpdmVBcnJheUJ1ZmZlcih0b0luZGV4KGUpKX07Zm9yKHZhciBBcnJheUJ1ZmZlclByb3RvdHlwZT0kQXJyYXlCdWZmZXJbUFJPVE9UWVBFXT1OYXRpdmVBcnJheUJ1ZmZlcltQUk9UT1RZUEVdLGtleXM9Z2V0T3duUHJvcGVydHlOYW1lcyhOYXRpdmVBcnJheUJ1ZmZlciksaj0wLGtleTtrZXlzLmxlbmd0aD5qOykoa2V5PWtleXNbaisrXSlpbiAkQXJyYXlCdWZmZXJ8fGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eSgkQXJyYXlCdWZmZXIsa2V5LE5hdGl2ZUFycmF5QnVmZmVyW2tleV0pO0FycmF5QnVmZmVyUHJvdG90eXBlLmNvbnN0cnVjdG9yPSRBcnJheUJ1ZmZlcn1vYmplY3RTZXRQcm90b3R5cGVPZiYmb2JqZWN0R2V0UHJvdG90eXBlT2YoJERhdGFWaWV3UHJvdG90eXBlKSE9PU9iamVjdFByb3RvdHlwZSYmb2JqZWN0U2V0UHJvdG90eXBlT2YoJERhdGFWaWV3UHJvdG90eXBlLE9iamVjdFByb3RvdHlwZSk7dmFyIHRlc3RWaWV3PW5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSksJHNldEludDg9JERhdGFWaWV3UHJvdG90eXBlLnNldEludDg7dGVzdFZpZXcuc2V0SW50OCgwLDIxNDc0ODM2NDgpLHRlc3RWaWV3LnNldEludDgoMSwyMTQ3NDgzNjQ5KSwhdGVzdFZpZXcuZ2V0SW50OCgwKSYmdGVzdFZpZXcuZ2V0SW50OCgxKXx8cmVkZWZpbmVBbGwoJERhdGFWaWV3UHJvdG90eXBlLHtzZXRJbnQ4OmZ1bmN0aW9uIHNldEludDgoZSxyKXskc2V0SW50OC5jYWxsKHRoaXMsZSxyPDwyND4+MjQpfSxzZXRVaW50ODpmdW5jdGlvbiBzZXRVaW50OChlLHIpeyRzZXRJbnQ4LmNhbGwodGhpcyxlLHI8PDI0Pj4yNCl9fSx7dW5zYWZlOiEwfSl9ZWxzZSAkQXJyYXlCdWZmZXI9ZnVuY3Rpb24gQXJyYXlCdWZmZXIoZSl7YW5JbnN0YW5jZSh0aGlzLCRBcnJheUJ1ZmZlcixBUlJBWV9CVUZGRVIpO3ZhciByPXRvSW5kZXgoZSk7c2V0SW50ZXJuYWxTdGF0ZSQzKHRoaXMse2J5dGVzOmFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShyKSwwKSxieXRlTGVuZ3RoOnJ9KSxkZXNjcmlwdG9yc3x8KHRoaXMuYnl0ZUxlbmd0aD1yKX0sJERhdGFWaWV3PWZ1bmN0aW9uIERhdGFWaWV3KGUscix0KXthbkluc3RhbmNlKHRoaXMsJERhdGFWaWV3LERBVEFfVklFVyksYW5JbnN0YW5jZShlLCRBcnJheUJ1ZmZlcixEQVRBX1ZJRVcpO3ZhciBhPWdldEludGVybmFsU3RhdGUkMShlKS5ieXRlTGVuZ3RoLGk9dG9JbnRlZ2VyKHIpO2lmKGk8MHx8aT5hKXRocm93IFJhbmdlRXJyb3IkMShcIldyb25nIG9mZnNldFwiKTtpZihpKyh0PXZvaWQgMD09PXQ/YS1pOnRvTGVuZ3RoKHQpKT5hKXRocm93IFJhbmdlRXJyb3IkMShXUk9OR19MRU5HVEgpO3NldEludGVybmFsU3RhdGUkMyh0aGlzLHtidWZmZXI6ZSxieXRlTGVuZ3RoOnQsYnl0ZU9mZnNldDppfSksZGVzY3JpcHRvcnN8fCh0aGlzLmJ1ZmZlcj1lLHRoaXMuYnl0ZUxlbmd0aD10LHRoaXMuYnl0ZU9mZnNldD1pKX0sZGVzY3JpcHRvcnMmJihhZGRHZXR0ZXIoJEFycmF5QnVmZmVyLFwiYnl0ZUxlbmd0aFwiKSxhZGRHZXR0ZXIoJERhdGFWaWV3LFwiYnVmZmVyXCIpLGFkZEdldHRlcigkRGF0YVZpZXcsXCJieXRlTGVuZ3RoXCIpLGFkZEdldHRlcigkRGF0YVZpZXcsXCJieXRlT2Zmc2V0XCIpKSxyZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSx7Z2V0SW50ODpmdW5jdGlvbiBnZXRJbnQ4KGUpe3JldHVybiBnZXQodGhpcywxLGUpWzBdPDwyND4+MjR9LGdldFVpbnQ4OmZ1bmN0aW9uIGdldFVpbnQ4KGUpe3JldHVybiBnZXQodGhpcywxLGUpWzBdfSxnZXRJbnQxNjpmdW5jdGlvbiBnZXRJbnQxNihlKXt2YXIgcj1nZXQodGhpcywyLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApO3JldHVybihyWzFdPDw4fHJbMF0pPDwxNj4+MTZ9LGdldFVpbnQxNjpmdW5jdGlvbiBnZXRVaW50MTYoZSl7dmFyIHI9Z2V0KHRoaXMsMixlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKTtyZXR1cm4gclsxXTw8OHxyWzBdfSxnZXRJbnQzMjpmdW5jdGlvbiBnZXRJbnQzMihlKXtyZXR1cm4gdW5wYWNrSW50MzIoZ2V0KHRoaXMsNCxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSl9LGdldFVpbnQzMjpmdW5jdGlvbiBnZXRVaW50MzIoZSl7cmV0dXJuIHVucGFja0ludDMyKGdldCh0aGlzLDQsZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCkpPj4+MH0sZ2V0RmxvYXQzMjpmdW5jdGlvbiBnZXRGbG9hdDMyKGUpe3JldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLDQsZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCksMjMpfSxnZXRGbG9hdDY0OmZ1bmN0aW9uIGdldEZsb2F0NjQoZSl7cmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsOCxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKSw1Mil9LHNldEludDg6ZnVuY3Rpb24gc2V0SW50OChlLHIpe3NldCh0aGlzLDEsZSxwYWNrSW50OCxyKX0sc2V0VWludDg6ZnVuY3Rpb24gc2V0VWludDgoZSxyKXtzZXQodGhpcywxLGUscGFja0ludDgscil9LHNldEludDE2OmZ1bmN0aW9uIHNldEludDE2KGUscil7c2V0KHRoaXMsMixlLHBhY2tJbnQxNixyLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0sc2V0VWludDE2OmZ1bmN0aW9uIHNldFVpbnQxNihlLHIpe3NldCh0aGlzLDIsZSxwYWNrSW50MTYscixhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9LHNldEludDMyOmZ1bmN0aW9uIHNldEludDMyKGUscil7c2V0KHRoaXMsNCxlLHBhY2tJbnQzMixyLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0sc2V0VWludDMyOmZ1bmN0aW9uIHNldFVpbnQzMihlLHIpe3NldCh0aGlzLDQsZSxwYWNrSW50MzIscixhcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCl9LHNldEZsb2F0MzI6ZnVuY3Rpb24gc2V0RmxvYXQzMihlLHIpe3NldCh0aGlzLDQsZSxwYWNrRmxvYXQzMixyLGFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwKX0sc2V0RmxvYXQ2NDpmdW5jdGlvbiBzZXRGbG9hdDY0KGUscil7c2V0KHRoaXMsOCxlLHBhY2tGbG9hdDY0LHIsYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApfX0pO3NldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlcixBUlJBWV9CVUZGRVIpLHNldFRvU3RyaW5nVGFnKCREYXRhVmlldyxEQVRBX1ZJRVcpO3ZhciBhcnJheUJ1ZmZlcj17QXJyYXlCdWZmZXI6JEFycmF5QnVmZmVyLERhdGFWaWV3OiREYXRhVmlld30sZmxvb3IkNT1NYXRoLmZsb29yLGlzSW50ZWdlcj1mdW5jdGlvbiBpc0ludGVnZXIoZSl7cmV0dXJuIWlzT2JqZWN0KGUpJiZpc0Zpbml0ZShlKSYmZmxvb3IkNShlKT09PWV9LHRvUG9zaXRpdmVJbnRlZ2VyPWZ1bmN0aW9uKGUpe3ZhciByPXRvSW50ZWdlcihlKTtpZihyPDApdGhyb3cgUmFuZ2VFcnJvcihcIlRoZSBhcmd1bWVudCBjYW4ndCBiZSBsZXNzIHRoYW4gMFwiKTtyZXR1cm4gcn0sdG9PZmZzZXQ9ZnVuY3Rpb24oZSxyKXt2YXIgdD10b1Bvc2l0aXZlSW50ZWdlcihlKTtpZih0JXIpdGhyb3cgUmFuZ2VFcnJvcihcIldyb25nIG9mZnNldFwiKTtyZXR1cm4gdH0sYVR5cGVkQXJyYXlDb25zdHJ1Y3RvciQxPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3Rvcix0eXBlZEFycmF5RnJvbT1mdW5jdGlvbiBmcm9tKGUpe3ZhciByLHQsYSxpLHMsYyxsPWFDb25zdHJ1Y3Rvcih0aGlzKSx1PXRvT2JqZWN0KGUpLHA9YXJndW1lbnRzLmxlbmd0aCxkPXA+MT9hcmd1bWVudHNbMV06dm9pZCAwLGg9dm9pZCAwIT09ZCx5PWdldEl0ZXJhdG9yTWV0aG9kKHUpO2lmKHkmJiFpc0FycmF5SXRlcmF0b3JNZXRob2QoeSkpZm9yKGM9KHM9Z2V0SXRlcmF0b3IodSx5KSkubmV4dCx1PVtdOyEoaT1jLmNhbGwocykpLmRvbmU7KXUucHVzaChpLnZhbHVlKTtmb3IoaCYmcD4yJiYoZD1mdW5jdGlvbkJpbmRDb250ZXh0KGQsYXJndW1lbnRzWzJdLDIpKSx0PXRvTGVuZ3RoKHUubGVuZ3RoKSxhPW5ldyhhVHlwZWRBcnJheUNvbnN0cnVjdG9yJDEobCkpKHQpLHI9MDt0PnI7cisrKWFbcl09aD9kKHVbcl0scik6dVtyXTtyZXR1cm4gYX0saXNBcnJheT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbiBpc0FycmF5KGUpe3JldHVyblwiQXJyYXlcIj09Y2xhc3NvZlJhdyhlKX0sU1BFQ0lFUyQyPXdlbGxLbm93blN5bWJvbChcInNwZWNpZXNcIiksYXJyYXlTcGVjaWVzQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIGlzQXJyYXkoZSkmJihyPWUuY29uc3RydWN0b3IsKGlzQ29uc3RydWN0b3IocikmJihyPT09QXJyYXl8fGlzQXJyYXkoci5wcm90b3R5cGUpKXx8aXNPYmplY3QocikmJm51bGw9PT0ocj1yW1NQRUNJRVMkMl0pKSYmKHI9dm9pZCAwKSksdm9pZCAwPT09cj9BcnJheTpyfSxhcnJheVNwZWNpZXNDcmVhdGU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbmV3KGFycmF5U3BlY2llc0NvbnN0cnVjdG9yKGUpKSgwPT09cj8wOnIpfSxwdXNoPVtdLnB1c2gsY3JlYXRlTWV0aG9kJDI9ZnVuY3Rpb24oZSl7dmFyIHI9MT09ZSx0PTI9PWUsYT0zPT1lLGk9ND09ZSxzPTY9PWUsYz03PT1lLGw9NT09ZXx8cztyZXR1cm4gZnVuY3Rpb24odSxwLGQsaCl7Zm9yKHZhciB5LEEsZz10b09iamVjdCh1KSx2PWluZGV4ZWRPYmplY3QoZyksRT1mdW5jdGlvbkJpbmRDb250ZXh0KHAsZCwzKSxtPXRvTGVuZ3RoKHYubGVuZ3RoKSxJPTAsUD1ofHxhcnJheVNwZWNpZXNDcmVhdGUsYj1yP1AodSxtKTp0fHxjP1AodSwwKTp2b2lkIDA7bT5JO0krKylpZigobHx8SSBpbiB2KSYmKEE9RSh5PXZbSV0sSSxnKSxlKSlpZihyKWJbSV09QTtlbHNlIGlmKEEpc3dpdGNoKGUpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBJO2Nhc2UgMjpwdXNoLmNhbGwoYix5KX1lbHNlIHN3aXRjaChlKXtjYXNlIDQ6cmV0dXJuITE7Y2FzZSA3OnB1c2guY2FsbChiLHkpfXJldHVybiBzPy0xOmF8fGk/aTpifX0sYXJyYXlJdGVyYXRpb249e2ZvckVhY2g6Y3JlYXRlTWV0aG9kJDIoMCksbWFwOmNyZWF0ZU1ldGhvZCQyKDEpLGZpbHRlcjpjcmVhdGVNZXRob2QkMigyKSxzb21lOmNyZWF0ZU1ldGhvZCQyKDMpLGV2ZXJ5OmNyZWF0ZU1ldGhvZCQyKDQpLGZpbmQ6Y3JlYXRlTWV0aG9kJDIoNSksZmluZEluZGV4OmNyZWF0ZU1ldGhvZCQyKDYpLGZpbHRlclJlamVjdDpjcmVhdGVNZXRob2QkMig3KX0sdHlwZWRBcnJheUNvbnN0cnVjdG9yPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKChmdW5jdGlvbihlKXt2YXIgcj1vYmplY3RHZXRPd25Qcm9wZXJ0eU5hbWVzLmYsdD1hcnJheUl0ZXJhdGlvbi5mb3JFYWNoLGE9aW50ZXJuYWxTdGF0ZS5nZXQsaT1pbnRlcm5hbFN0YXRlLnNldCxzPW9iamVjdERlZmluZVByb3BlcnR5LmYsYz1vYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IuZixsPU1hdGgucm91bmQsdT1nbG9iYWwkMS5SYW5nZUVycm9yLHA9YXJyYXlCdWZmZXIuQXJyYXlCdWZmZXIsZD1hcnJheUJ1ZmZlci5EYXRhVmlldyxoPWFycmF5QnVmZmVyVmlld0NvcmUuTkFUSVZFX0FSUkFZX0JVRkZFUl9WSUVXUyx5PWFycmF5QnVmZmVyVmlld0NvcmUuVFlQRURfQVJSQVlfQ09OU1RSVUNUT1IsQT1hcnJheUJ1ZmZlclZpZXdDb3JlLlRZUEVEX0FSUkFZX1RBRyxnPWFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheSx2PWFycmF5QnVmZmVyVmlld0NvcmUuVHlwZWRBcnJheVByb3RvdHlwZSxFPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXlDb25zdHJ1Y3RvcixtPWFycmF5QnVmZmVyVmlld0NvcmUuaXNUeXBlZEFycmF5LGZyb21MaXN0PWZ1bmN0aW9uKGUscil7Zm9yKHZhciB0PTAsYT1yLmxlbmd0aCxpPW5ldyhFKGUpKShhKTthPnQ7KWlbdF09clt0KytdO3JldHVybiBpfSxhZGRHZXR0ZXI9ZnVuY3Rpb24oZSxyKXtzKGUscix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcylbcl19fSl9LGlzQXJyYXlCdWZmZXI9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIGUgaW5zdGFuY2VvZiBwfHxcIkFycmF5QnVmZmVyXCI9PShyPWNsYXNzb2YoZSkpfHxcIlNoYXJlZEFycmF5QnVmZmVyXCI9PXJ9LGlzVHlwZWRBcnJheUluZGV4PWZ1bmN0aW9uKGUscil7cmV0dXJuIG0oZSkmJiFpc1N5bWJvbChyKSYmciBpbiBlJiZpc0ludGVnZXIoK3IpJiZyPj0wfSxJPWZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpe3JldHVybiByPXRvUHJvcGVydHlLZXkociksaXNUeXBlZEFycmF5SW5kZXgoZSxyKT9jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMixlW3JdKTpjKGUscil9LFA9ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoZSxyLHQpe3JldHVybiByPXRvUHJvcGVydHlLZXkociksIShpc1R5cGVkQXJyYXlJbmRleChlLHIpJiZpc09iamVjdCh0KSYmaGFzJDEodCxcInZhbHVlXCIpKXx8aGFzJDEodCxcImdldFwiKXx8aGFzJDEodCxcInNldFwiKXx8dC5jb25maWd1cmFibGV8fGhhcyQxKHQsXCJ3cml0YWJsZVwiKSYmIXQud3JpdGFibGV8fGhhcyQxKHQsXCJlbnVtZXJhYmxlXCIpJiYhdC5lbnVtZXJhYmxlP3MoZSxyLHQpOihlW3JdPXQudmFsdWUsZSl9O2Rlc2NyaXB0b3JzPyhofHwob2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLmY9SSxvYmplY3REZWZpbmVQcm9wZXJ0eS5mPVAsYWRkR2V0dGVyKHYsXCJidWZmZXJcIiksYWRkR2V0dGVyKHYsXCJieXRlT2Zmc2V0XCIpLGFkZEdldHRlcih2LFwiYnl0ZUxlbmd0aFwiKSxhZGRHZXR0ZXIodixcImxlbmd0aFwiKSksX2V4cG9ydCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6IWh9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6SSxkZWZpbmVQcm9wZXJ0eTpQfSksZS5leHBvcnRzPWZ1bmN0aW9uKGUsYyxFKXt2YXIgST1lLm1hdGNoKC9cXGQrJC8pWzBdLzgsUD1lKyhFP1wiQ2xhbXBlZFwiOlwiXCIpK1wiQXJyYXlcIixiPVwiZ2V0XCIrZSxUPVwic2V0XCIrZSxTPWdsb2JhbCQxW1BdLFI9UyxfPVImJlIucHJvdG90eXBlLFU9e30sYWRkRWxlbWVudD1mdW5jdGlvbihlLHIpe3MoZSxyLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgdD1hKGUpO3JldHVybiB0LnZpZXdbYl0ocipJK3QuYnl0ZU9mZnNldCwhMCl9KHRoaXMscil9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSxyLHQpe3ZhciBpPWEoZSk7RSYmKHQ9KHQ9bCh0KSk8MD8wOnQ+MjU1PzI1NToyNTUmdCksaS52aWV3W1RdKHIqSStpLmJ5dGVPZmZzZXQsdCwhMCl9KHRoaXMscixlKX0sZW51bWVyYWJsZTohMH0pfTtoP3R5cGVkQXJyYXlDb25zdHJ1Y3RvcnNSZXF1aXJlV3JhcHBlcnMmJihSPWMoKGZ1bmN0aW9uKGUscix0LGEpe3JldHVybiBhbkluc3RhbmNlKGUsUixQKSxpbmhlcml0SWZSZXF1aXJlZChpc09iamVjdChyKT9pc0FycmF5QnVmZmVyKHIpP3ZvaWQgMCE9PWE/bmV3IFMocix0b09mZnNldCh0LEkpLGEpOnZvaWQgMCE9PXQ/bmV3IFMocix0b09mZnNldCh0LEkpKTpuZXcgUyhyKTptKHIpP2Zyb21MaXN0KFIscik6dHlwZWRBcnJheUZyb20uY2FsbChSLHIpOm5ldyBTKHRvSW5kZXgocikpLGUsUil9KSksb2JqZWN0U2V0UHJvdG90eXBlT2YmJm9iamVjdFNldFByb3RvdHlwZU9mKFIsZyksdChyKFMpLChmdW5jdGlvbihlKXtlIGluIFJ8fGNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShSLGUsU1tlXSl9KSksUi5wcm90b3R5cGU9Xyk6KFI9YygoZnVuY3Rpb24oZSxyLHQsYSl7YW5JbnN0YW5jZShlLFIsUCk7dmFyIHMsYyxsLGg9MCx5PTA7aWYoaXNPYmplY3Qocikpe2lmKCFpc0FycmF5QnVmZmVyKHIpKXJldHVybiBtKHIpP2Zyb21MaXN0KFIscik6dHlwZWRBcnJheUZyb20uY2FsbChSLHIpO3M9cix5PXRvT2Zmc2V0KHQsSSk7dmFyIEE9ci5ieXRlTGVuZ3RoO2lmKHZvaWQgMD09PWEpe2lmKEElSSl0aHJvdyB1KFwiV3JvbmcgbGVuZ3RoXCIpO2lmKChjPUEteSk8MCl0aHJvdyB1KFwiV3JvbmcgbGVuZ3RoXCIpfWVsc2UgaWYoKGM9dG9MZW5ndGgoYSkqSSkreT5BKXRocm93IHUoXCJXcm9uZyBsZW5ndGhcIik7bD1jL0l9ZWxzZSBsPXRvSW5kZXgocikscz1uZXcgcChjPWwqSSk7Zm9yKGkoZSx7YnVmZmVyOnMsYnl0ZU9mZnNldDp5LGJ5dGVMZW5ndGg6YyxsZW5ndGg6bCx2aWV3Om5ldyBkKHMpfSk7aDxsOylhZGRFbGVtZW50KGUsaCsrKX0pKSxvYmplY3RTZXRQcm90b3R5cGVPZiYmb2JqZWN0U2V0UHJvdG90eXBlT2YoUixnKSxfPVIucHJvdG90eXBlPW9iamVjdENyZWF0ZSh2KSksXy5jb25zdHJ1Y3RvciE9PVImJmNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShfLFwiY29uc3RydWN0b3JcIixSKSxjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoXyx5LFIpLEEmJmNyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShfLEEsUCksVVtQXT1SLF9leHBvcnQoe2dsb2JhbDohMCxmb3JjZWQ6UiE9UyxzaGFtOiFofSxVKSxcIkJZVEVTX1BFUl9FTEVNRU5UXCJpbiBSfHxjcmVhdGVOb25FbnVtZXJhYmxlUHJvcGVydHkoUixcIkJZVEVTX1BFUl9FTEVNRU5UXCIsSSksXCJCWVRFU19QRVJfRUxFTUVOVFwiaW4gX3x8Y3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KF8sXCJCWVRFU19QRVJfRUxFTUVOVFwiLEkpLHNldFNwZWNpZXMoUCl9KTplLmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSkpO3R5cGVkQXJyYXlDb25zdHJ1Y3RvcihcIlVpbnQ4XCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KHIsdCxhKXtyZXR1cm4gZSh0aGlzLHIsdCxhKX19KSk7dmFyIG1pbiQzPU1hdGgubWluLGFycmF5Q29weVdpdGhpbj1bXS5jb3B5V2l0aGlufHxmdW5jdGlvbiBjb3B5V2l0aGluKGUscil7dmFyIHQ9dG9PYmplY3QodGhpcyksYT10b0xlbmd0aCh0Lmxlbmd0aCksaT10b0Fic29sdXRlSW5kZXgoZSxhKSxzPXRvQWJzb2x1dGVJbmRleChyLGEpLGM9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsbD1taW4kMygodm9pZCAwPT09Yz9hOnRvQWJzb2x1dGVJbmRleChjLGEpKS1zLGEtaSksdT0xO2ZvcihzPGkmJmk8cytsJiYodT0tMSxzKz1sLTEsaSs9bC0xKTtsLS0gPjA7KXMgaW4gdD90W2ldPXRbc106ZGVsZXRlIHRbaV0saSs9dSxzKz11O3JldHVybiB0fSxhVHlwZWRBcnJheSRsPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRtPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJG0oXCJjb3B5V2l0aGluXCIsKGZ1bmN0aW9uIGNvcHlXaXRoaW4oZSxyKXtyZXR1cm4gYXJyYXlDb3B5V2l0aGluLmNhbGwoYVR5cGVkQXJyYXkkbCh0aGlzKSxlLHIsYXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDApfSkpO3ZhciAkZXZlcnk9YXJyYXlJdGVyYXRpb24uZXZlcnksYVR5cGVkQXJyYXkkaz1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkbD1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRsKFwiZXZlcnlcIiwoZnVuY3Rpb24gZXZlcnkoZSl7cmV0dXJuICRldmVyeShhVHlwZWRBcnJheSRrKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciBhVHlwZWRBcnJheSRqPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRrPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGsoXCJmaWxsXCIsKGZ1bmN0aW9uIGZpbGwoZSl7cmV0dXJuIGFycmF5RmlsbC5hcHBseShhVHlwZWRBcnJheSRqKHRoaXMpLGFyZ3VtZW50cyl9KSk7dmFyIGFycmF5RnJvbUNvbnN0cnVjdG9yQW5kTGlzdD1mdW5jdGlvbihlLHIpe2Zvcih2YXIgdD0wLGE9ci5sZW5ndGgsaT1uZXcgZShhKTthPnQ7KWlbdF09clt0KytdO3JldHVybiBpfSxUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUj1hcnJheUJ1ZmZlclZpZXdDb3JlLlRZUEVEX0FSUkFZX0NPTlNUUlVDVE9SLGFUeXBlZEFycmF5Q29uc3RydWN0b3I9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheUNvbnN0cnVjdG9yLHR5cGVkQXJyYXlTcGVjaWVzQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFUeXBlZEFycmF5Q29uc3RydWN0b3Ioc3BlY2llc0NvbnN0cnVjdG9yKGUsZVtUWVBFRF9BUlJBWV9DT05TVFJVQ1RPUl0pKX0sdHlwZWRBcnJheUZyb21TcGVjaWVzQW5kTGlzdD1mdW5jdGlvbihlLHIpe3JldHVybiBhcnJheUZyb21Db25zdHJ1Y3RvckFuZExpc3QodHlwZWRBcnJheVNwZWNpZXNDb25zdHJ1Y3RvcihlKSxyKX0sJGZpbHRlciQxPWFycmF5SXRlcmF0aW9uLmZpbHRlcixhVHlwZWRBcnJheSRpPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRqPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGooXCJmaWx0ZXJcIiwoZnVuY3Rpb24gZmlsdGVyKGUpe3ZhciByPSRmaWx0ZXIkMShhVHlwZWRBcnJheSRpKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApO3JldHVybiB0eXBlZEFycmF5RnJvbVNwZWNpZXNBbmRMaXN0KHRoaXMscil9KSk7dmFyICRmaW5kPWFycmF5SXRlcmF0aW9uLmZpbmQsYVR5cGVkQXJyYXkkaD1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkaT1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRpKFwiZmluZFwiLChmdW5jdGlvbiBmaW5kKGUpe3JldHVybiAkZmluZChhVHlwZWRBcnJheSRoKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciAkZmluZEluZGV4PWFycmF5SXRlcmF0aW9uLmZpbmRJbmRleCxhVHlwZWRBcnJheSRnPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRoPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGgoXCJmaW5kSW5kZXhcIiwoZnVuY3Rpb24gZmluZEluZGV4KGUpe3JldHVybiAkZmluZEluZGV4KGFUeXBlZEFycmF5JGcodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyICRmb3JFYWNoJDE9YXJyYXlJdGVyYXRpb24uZm9yRWFjaCxhVHlwZWRBcnJheSRmPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRnPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGcoXCJmb3JFYWNoXCIsKGZ1bmN0aW9uIGZvckVhY2goZSl7JGZvckVhY2gkMShhVHlwZWRBcnJheSRmKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciAkaW5jbHVkZXMkMT1hcnJheUluY2x1ZGVzLmluY2x1ZGVzLGFUeXBlZEFycmF5JGU9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheSxleHBvcnRUeXBlZEFycmF5TWV0aG9kJGY9YXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO2V4cG9ydFR5cGVkQXJyYXlNZXRob2QkZihcImluY2x1ZGVzXCIsKGZ1bmN0aW9uIGluY2x1ZGVzKGUpe3JldHVybiAkaW5jbHVkZXMkMShhVHlwZWRBcnJheSRlKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciAkaW5kZXhPZj1hcnJheUluY2x1ZGVzLmluZGV4T2YsYVR5cGVkQXJyYXkkZD1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkZT1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRlKFwiaW5kZXhPZlwiLChmdW5jdGlvbiBpbmRleE9mKGUpe3JldHVybiAkaW5kZXhPZihhVHlwZWRBcnJheSRkKHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciBQUk9QRVJfRlVOQ1RJT05fTkFNRSQxPWZ1bmN0aW9uTmFtZS5QUk9QRVIsSVRFUkFUT1IkMz13ZWxsS25vd25TeW1ib2woXCJpdGVyYXRvclwiKSxVaW50OEFycmF5JDI9Z2xvYmFsJDEuVWludDhBcnJheSxhcnJheVZhbHVlcz1lc19hcnJheV9pdGVyYXRvci52YWx1ZXMsYXJyYXlLZXlzPWVzX2FycmF5X2l0ZXJhdG9yLmtleXMsYXJyYXlFbnRyaWVzPWVzX2FycmF5X2l0ZXJhdG9yLmVudHJpZXMsYVR5cGVkQXJyYXkkYz1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkZD1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsbmF0aXZlVHlwZWRBcnJheUl0ZXJhdG9yPVVpbnQ4QXJyYXkkMiYmVWludDhBcnJheSQyLnByb3RvdHlwZVtJVEVSQVRPUiQzXSxQUk9QRVJfQVJSQVlfVkFMVUVTX05BTUU9ISFuYXRpdmVUeXBlZEFycmF5SXRlcmF0b3ImJlwidmFsdWVzXCI9PT1uYXRpdmVUeXBlZEFycmF5SXRlcmF0b3IubmFtZSx0eXBlZEFycmF5VmFsdWVzPWZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiBhcnJheVZhbHVlcy5jYWxsKGFUeXBlZEFycmF5JGModGhpcykpfTtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGQoXCJlbnRyaWVzXCIsKGZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwoYVR5cGVkQXJyYXkkYyh0aGlzKSl9KSksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRkKFwia2V5c1wiLChmdW5jdGlvbiBrZXlzKCl7cmV0dXJuIGFycmF5S2V5cy5jYWxsKGFUeXBlZEFycmF5JGModGhpcykpfSkpLGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkZChcInZhbHVlc1wiLHR5cGVkQXJyYXlWYWx1ZXMsUFJPUEVSX0ZVTkNUSU9OX05BTUUkMSYmIVBST1BFUl9BUlJBWV9WQUxVRVNfTkFNRSksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRkKElURVJBVE9SJDMsdHlwZWRBcnJheVZhbHVlcyxQUk9QRVJfRlVOQ1RJT05fTkFNRSQxJiYhUFJPUEVSX0FSUkFZX1ZBTFVFU19OQU1FKTt2YXIgYVR5cGVkQXJyYXkkYj1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkYz1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsJGpvaW49W10uam9pbjtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGMoXCJqb2luXCIsKGZ1bmN0aW9uIGpvaW4oZSl7cmV0dXJuICRqb2luLmFwcGx5KGFUeXBlZEFycmF5JGIodGhpcyksYXJndW1lbnRzKX0pKTt2YXIgYXJyYXlNZXRob2RJc1N0cmljdD1mdW5jdGlvbihlLHIpe3ZhciB0PVtdW2VdO3JldHVybiEhdCYmZmFpbHMoKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwscnx8ZnVuY3Rpb24oKXt0aHJvdyAxfSwxKX0pKX0sbWluJDI9TWF0aC5taW4sJGxhc3RJbmRleE9mPVtdLmxhc3RJbmRleE9mLE5FR0FUSVZFX1pFUk89ISEkbGFzdEluZGV4T2YmJjEvWzFdLmxhc3RJbmRleE9mKDEsLTApPDAsU1RSSUNUX01FVEhPRCQyPWFycmF5TWV0aG9kSXNTdHJpY3QoXCJsYXN0SW5kZXhPZlwiKSxGT1JDRUQkNT1ORUdBVElWRV9aRVJPfHwhU1RSSUNUX01FVEhPRCQyLGFycmF5TGFzdEluZGV4T2Y9Rk9SQ0VEJDU/ZnVuY3Rpb24gbGFzdEluZGV4T2YoZSl7aWYoTkVHQVRJVkVfWkVSTylyZXR1cm4gJGxhc3RJbmRleE9mLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDt2YXIgcj10b0luZGV4ZWRPYmplY3QodGhpcyksdD10b0xlbmd0aChyLmxlbmd0aCksYT10LTE7Zm9yKGFyZ3VtZW50cy5sZW5ndGg+MSYmKGE9bWluJDIoYSx0b0ludGVnZXIoYXJndW1lbnRzWzFdKSkpLGE8MCYmKGE9dCthKTthPj0wO2EtLSlpZihhIGluIHImJnJbYV09PT1lKXJldHVybiBhfHwwO3JldHVybi0xfTokbGFzdEluZGV4T2YsYVR5cGVkQXJyYXkkYT1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkYj1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRiKFwibGFzdEluZGV4T2ZcIiwoZnVuY3Rpb24gbGFzdEluZGV4T2YoZSl7cmV0dXJuIGFycmF5TGFzdEluZGV4T2YuYXBwbHkoYVR5cGVkQXJyYXkkYSh0aGlzKSxhcmd1bWVudHMpfSkpO3ZhciAkbWFwPWFycmF5SXRlcmF0aW9uLm1hcCxhVHlwZWRBcnJheSQ5PWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCRhPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJGEoXCJtYXBcIiwoZnVuY3Rpb24gbWFwKGUpe3JldHVybiAkbWFwKGFUeXBlZEFycmF5JDkodGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwoZnVuY3Rpb24oZSxyKXtyZXR1cm4gbmV3KHR5cGVkQXJyYXlTcGVjaWVzQ29uc3RydWN0b3IoZSkpKHIpfSkpfSkpO3ZhciBjcmVhdGVNZXRob2QkMT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocix0LGEsaSl7YUNhbGxhYmxlKHQpO3ZhciBzPXRvT2JqZWN0KHIpLGM9aW5kZXhlZE9iamVjdChzKSxsPXRvTGVuZ3RoKHMubGVuZ3RoKSx1PWU/bC0xOjAscD1lPy0xOjE7aWYoYTwyKWZvcig7Oyl7aWYodSBpbiBjKXtpPWNbdV0sdSs9cDticmVha31pZih1Kz1wLGU/dTwwOmw8PXUpdGhyb3cgVHlwZUVycm9yKFwiUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZVwiKX1mb3IoO2U/dT49MDpsPnU7dSs9cCl1IGluIGMmJihpPXQoaSxjW3VdLHUscykpO3JldHVybiBpfX0sYXJyYXlSZWR1Y2U9e2xlZnQ6Y3JlYXRlTWV0aG9kJDEoITEpLHJpZ2h0OmNyZWF0ZU1ldGhvZCQxKCEwKX0sJHJlZHVjZT1hcnJheVJlZHVjZS5sZWZ0LGFUeXBlZEFycmF5JDg9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheSxleHBvcnRUeXBlZEFycmF5TWV0aG9kJDk9YXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO2V4cG9ydFR5cGVkQXJyYXlNZXRob2QkOShcInJlZHVjZVwiLChmdW5jdGlvbiByZWR1Y2UoZSl7cmV0dXJuICRyZWR1Y2UoYVR5cGVkQXJyYXkkOCh0aGlzKSxlLGFyZ3VtZW50cy5sZW5ndGgsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfSkpO3ZhciAkcmVkdWNlUmlnaHQ9YXJyYXlSZWR1Y2UucmlnaHQsYVR5cGVkQXJyYXkkNz1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkOD1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2Q7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQ4KFwicmVkdWNlUmlnaHRcIiwoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZSl7cmV0dXJuICRyZWR1Y2VSaWdodChhVHlwZWRBcnJheSQ3KHRoaXMpLGUsYXJndW1lbnRzLmxlbmd0aCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGFUeXBlZEFycmF5JDY9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheSxleHBvcnRUeXBlZEFycmF5TWV0aG9kJDc9YXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kLGZsb29yJDQ9TWF0aC5mbG9vcjtleHBvcnRUeXBlZEFycmF5TWV0aG9kJDcoXCJyZXZlcnNlXCIsKGZ1bmN0aW9uIHJldmVyc2UoKXtmb3IodmFyIGUscj1hVHlwZWRBcnJheSQ2KHRoaXMpLmxlbmd0aCx0PWZsb29yJDQoci8yKSxhPTA7YTx0OyllPXRoaXNbYV0sdGhpc1thKytdPXRoaXNbLS1yXSx0aGlzW3JdPWU7cmV0dXJuIHRoaXN9KSk7dmFyIGFUeXBlZEFycmF5JDU9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheSxleHBvcnRUeXBlZEFycmF5TWV0aG9kJDY9YXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kLEZPUkNFRCQ0PWZhaWxzKChmdW5jdGlvbigpe25ldyBJbnQ4QXJyYXkoMSkuc2V0KHt9KX0pKTtleHBvcnRUeXBlZEFycmF5TWV0aG9kJDYoXCJzZXRcIiwoZnVuY3Rpb24gc2V0KGUpe2FUeXBlZEFycmF5JDUodGhpcyk7dmFyIHI9dG9PZmZzZXQoYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMSksdD10aGlzLmxlbmd0aCxhPXRvT2JqZWN0KGUpLGk9dG9MZW5ndGgoYS5sZW5ndGgpLHM9MDtpZihpK3I+dCl0aHJvdyBSYW5nZUVycm9yKFwiV3JvbmcgbGVuZ3RoXCIpO2Zvcig7czxpOyl0aGlzW3Irc109YVtzKytdfSksRk9SQ0VEJDQpO3ZhciBhVHlwZWRBcnJheSQ0PWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQ1PWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCwkc2xpY2UkMT1bXS5zbGljZSxGT1JDRUQkMz1mYWlscygoZnVuY3Rpb24oKXtuZXcgSW50OEFycmF5KDEpLnNsaWNlKCl9KSk7ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQ1KFwic2xpY2VcIiwoZnVuY3Rpb24gc2xpY2UoZSxyKXtmb3IodmFyIHQ9JHNsaWNlJDEuY2FsbChhVHlwZWRBcnJheSQ0KHRoaXMpLGUsciksYT10eXBlZEFycmF5U3BlY2llc0NvbnN0cnVjdG9yKHRoaXMpLGk9MCxzPXQubGVuZ3RoLGM9bmV3IGEocyk7cz5pOyljW2ldPXRbaSsrXTtyZXR1cm4gY30pLEZPUkNFRCQzKTt2YXIgJHNvbWU9YXJyYXlJdGVyYXRpb24uc29tZSxhVHlwZWRBcnJheSQzPWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQ0PWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZDtleHBvcnRUeXBlZEFycmF5TWV0aG9kJDQoXCJzb21lXCIsKGZ1bmN0aW9uIHNvbWUoZSl7cmV0dXJuICRzb21lKGFUeXBlZEFycmF5JDModGhpcyksZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9KSk7dmFyIGZsb29yJDM9TWF0aC5mbG9vcixtZXJnZVNvcnQ9ZnVuY3Rpb24oZSxyKXt2YXIgdD1lLmxlbmd0aCxhPWZsb29yJDModC8yKTtyZXR1cm4gdDw4P2luc2VydGlvblNvcnQoZSxyKTptZXJnZShtZXJnZVNvcnQoZS5zbGljZSgwLGEpLHIpLG1lcmdlU29ydChlLnNsaWNlKGEpLHIpLHIpfSxpbnNlcnRpb25Tb3J0PWZ1bmN0aW9uKGUscil7Zm9yKHZhciB0LGEsaT1lLmxlbmd0aCxzPTE7czxpOyl7Zm9yKGE9cyx0PWVbc107YSYmcihlW2EtMV0sdCk+MDspZVthXT1lWy0tYV07YSE9PXMrKyYmKGVbYV09dCl9cmV0dXJuIGV9LG1lcmdlPWZ1bmN0aW9uKGUscix0KXtmb3IodmFyIGE9ZS5sZW5ndGgsaT1yLmxlbmd0aCxzPTAsYz0wLGw9W107czxhfHxjPGk7KXM8YSYmYzxpP2wucHVzaCh0KGVbc10scltjXSk8PTA/ZVtzKytdOnJbYysrXSk6bC5wdXNoKHM8YT9lW3MrK106cltjKytdKTtyZXR1cm4gbH0sYXJyYXlTb3J0PW1lcmdlU29ydCxmaXJlZm94PWVuZ2luZVVzZXJBZ2VudC5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS9pKSxlbmdpbmVGZlZlcnNpb249ISFmaXJlZm94JiYrZmlyZWZveFsxXSxlbmdpbmVJc0llT3JFZGdlPS9NU0lFfFRyaWRlbnQvLnRlc3QoZW5naW5lVXNlckFnZW50KSx3ZWJraXQ9ZW5naW5lVXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLyhcXGQrKVxcLi8pLGVuZ2luZVdlYmtpdFZlcnNpb249ISF3ZWJraXQmJit3ZWJraXRbMV0sYVR5cGVkQXJyYXkkMj1hcnJheUJ1ZmZlclZpZXdDb3JlLmFUeXBlZEFycmF5LGV4cG9ydFR5cGVkQXJyYXlNZXRob2QkMz1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsVWludDE2QXJyYXkkMT1nbG9iYWwkMS5VaW50MTZBcnJheSxuYXRpdmVTb3J0JDE9VWludDE2QXJyYXkkMSYmVWludDE2QXJyYXkkMS5wcm90b3R5cGUuc29ydCxBQ0NFUFRfSU5DT1JSRUNUX0FSR1VNRU5UUz0hIW5hdGl2ZVNvcnQkMSYmIWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50MTZBcnJheSQxKDIpO2Uuc29ydChudWxsKSxlLnNvcnQoe30pfSkpLFNUQUJMRV9TT1JUJDE9ISFuYXRpdmVTb3J0JDEmJiFmYWlscygoZnVuY3Rpb24oKXtpZihlbmdpbmVWOFZlcnNpb24pcmV0dXJuIGVuZ2luZVY4VmVyc2lvbjw3NDtpZihlbmdpbmVGZlZlcnNpb24pcmV0dXJuIGVuZ2luZUZmVmVyc2lvbjw2NztpZihlbmdpbmVJc0llT3JFZGdlKXJldHVybiEwO2lmKGVuZ2luZVdlYmtpdFZlcnNpb24pcmV0dXJuIGVuZ2luZVdlYmtpdFZlcnNpb248NjAyO3ZhciBlLHIsdD1uZXcgVWludDE2QXJyYXkkMSg1MTYpLGE9QXJyYXkoNTE2KTtmb3IoZT0wO2U8NTE2O2UrKylyPWUlNCx0W2VdPTUxNS1lLGFbZV09ZS0yKnIrMztmb3IodC5zb3J0KChmdW5jdGlvbihlLHIpe3JldHVybihlLzR8MCktKHIvNHwwKX0pKSxlPTA7ZTw1MTY7ZSsrKWlmKHRbZV0hPT1hW2VdKXJldHVybiEwfSkpLGdldFNvcnRDb21wYXJlJDE9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIHZvaWQgMCE9PWU/K2Uocix0KXx8MDp0IT10Py0xOnIhPXI/MTowPT09ciYmMD09PXQ/MS9yPjAmJjEvdDwwPzE6LTE6cj50fX07ZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQzKFwic29ydFwiLChmdW5jdGlvbiBzb3J0KGUpe2lmKHZvaWQgMCE9PWUmJmFDYWxsYWJsZShlKSxTVEFCTEVfU09SVCQxKXJldHVybiBuYXRpdmVTb3J0JDEuY2FsbCh0aGlzLGUpO2FUeXBlZEFycmF5JDIodGhpcyk7dmFyIHIsdD10b0xlbmd0aCh0aGlzLmxlbmd0aCksYT1BcnJheSh0KTtmb3Iocj0wO3I8dDtyKyspYVtyXT10aGlzW3JdO2ZvcihhPWFycmF5U29ydCh0aGlzLGdldFNvcnRDb21wYXJlJDEoZSkpLHI9MDtyPHQ7cisrKXRoaXNbcl09YVtyXTtyZXR1cm4gdGhpc30pLCFTVEFCTEVfU09SVCQxfHxBQ0NFUFRfSU5DT1JSRUNUX0FSR1VNRU5UUyk7dmFyIGFUeXBlZEFycmF5JDE9YXJyYXlCdWZmZXJWaWV3Q29yZS5hVHlwZWRBcnJheSxleHBvcnRUeXBlZEFycmF5TWV0aG9kJDI9YXJyYXlCdWZmZXJWaWV3Q29yZS5leHBvcnRUeXBlZEFycmF5TWV0aG9kO2V4cG9ydFR5cGVkQXJyYXlNZXRob2QkMihcInN1YmFycmF5XCIsKGZ1bmN0aW9uIHN1YmFycmF5KGUscil7dmFyIHQ9YVR5cGVkQXJyYXkkMSh0aGlzKSxhPXQubGVuZ3RoLGk9dG9BYnNvbHV0ZUluZGV4KGUsYSk7cmV0dXJuIG5ldyh0eXBlZEFycmF5U3BlY2llc0NvbnN0cnVjdG9yKHQpKSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQraSp0LkJZVEVTX1BFUl9FTEVNRU5ULHRvTGVuZ3RoKCh2b2lkIDA9PT1yP2E6dG9BYnNvbHV0ZUluZGV4KHIsYSkpLWkpKX0pKTt2YXIgSW50OEFycmF5JDE9Z2xvYmFsJDEuSW50OEFycmF5LGFUeXBlZEFycmF5PWFycmF5QnVmZmVyVmlld0NvcmUuYVR5cGVkQXJyYXksZXhwb3J0VHlwZWRBcnJheU1ldGhvZCQxPWFycmF5QnVmZmVyVmlld0NvcmUuZXhwb3J0VHlwZWRBcnJheU1ldGhvZCwkdG9Mb2NhbGVTdHJpbmc9W10udG9Mb2NhbGVTdHJpbmcsJHNsaWNlPVtdLnNsaWNlLFRPX0xPQ0FMRV9TVFJJTkdfQlVHPSEhSW50OEFycmF5JDEmJmZhaWxzKChmdW5jdGlvbigpeyR0b0xvY2FsZVN0cmluZy5jYWxsKG5ldyBJbnQ4QXJyYXkkMSgxKSl9KSksRk9SQ0VEJDI9ZmFpbHMoKGZ1bmN0aW9uKCl7cmV0dXJuWzEsMl0udG9Mb2NhbGVTdHJpbmcoKSE9bmV3IEludDhBcnJheSQxKFsxLDJdKS50b0xvY2FsZVN0cmluZygpfSkpfHwhZmFpbHMoKGZ1bmN0aW9uKCl7SW50OEFycmF5JDEucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsMl0pfSkpO2V4cG9ydFR5cGVkQXJyYXlNZXRob2QkMShcInRvTG9jYWxlU3RyaW5nXCIsKGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCl7cmV0dXJuICR0b0xvY2FsZVN0cmluZy5hcHBseShUT19MT0NBTEVfU1RSSU5HX0JVRz8kc2xpY2UuY2FsbChhVHlwZWRBcnJheSh0aGlzKSk6YVR5cGVkQXJyYXkodGhpcyksYXJndW1lbnRzKX0pLEZPUkNFRCQyKTt2YXIgZXhwb3J0VHlwZWRBcnJheU1ldGhvZD1hcnJheUJ1ZmZlclZpZXdDb3JlLmV4cG9ydFR5cGVkQXJyYXlNZXRob2QsVWludDhBcnJheSQxPWdsb2JhbCQxLlVpbnQ4QXJyYXksVWludDhBcnJheVByb3RvdHlwZT1VaW50OEFycmF5JDEmJlVpbnQ4QXJyYXkkMS5wcm90b3R5cGV8fHt9LGFycmF5VG9TdHJpbmc9W10udG9TdHJpbmcsYXJyYXlKb2luPVtdLmpvaW47ZmFpbHMoKGZ1bmN0aW9uKCl7YXJyYXlUb1N0cmluZy5jYWxsKHt9KX0pKSYmKGFycmF5VG9TdHJpbmc9ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gYXJyYXlKb2luLmNhbGwodGhpcyl9KTt2YXIgSVNfTk9UX0FSUkFZX01FVEhPRD1VaW50OEFycmF5UHJvdG90eXBlLnRvU3RyaW5nIT1hcnJheVRvU3RyaW5nO2V4cG9ydFR5cGVkQXJyYXlNZXRob2QoXCJ0b1N0cmluZ1wiLGFycmF5VG9TdHJpbmcsSVNfTk9UX0FSUkFZX01FVEhPRCk7dmFyICRpbmNsdWRlcz1hcnJheUluY2x1ZGVzLmluY2x1ZGVzO19leHBvcnQoe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITB9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyhlKXtyZXR1cm4gJGluY2x1ZGVzKHRoaXMsZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksYWRkVG9VbnNjb3BhYmxlcyhcImluY2x1ZGVzXCIpO3ZhciBub3RBUmVnZXhwPWZ1bmN0aW9uKGUpe2lmKGlzUmVnZXhwKGUpKXRocm93IFR5cGVFcnJvcihcIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9uc1wiKTtyZXR1cm4gZX0sTUFUQ0g9d2VsbEtub3duU3ltYm9sKFwibWF0Y2hcIiksY29ycmVjdElzUmVnZXhwTG9naWM9ZnVuY3Rpb24oZSl7dmFyIHI9Ly4vO3RyeXtcIi8uL1wiW2VdKHIpfWNhdGNoKHQpe3RyeXtyZXR1cm4gcltNQVRDSF09ITEsXCIvLi9cIltlXShyKX1jYXRjaChlKXt9fXJldHVybiExfTtfZXhwb3J0KHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6IWNvcnJlY3RJc1JlZ2V4cExvZ2ljKFwiaW5jbHVkZXNcIil9LHtpbmNsdWRlczpmdW5jdGlvbiBpbmNsdWRlcyhlKXtyZXR1cm4hIX50b1N0cmluZyhyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKHRoaXMpKS5pbmRleE9mKHRvU3RyaW5nKG5vdEFSZWdleHAoZSkpLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgY3JlYXRlUHJvcGVydHk9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhPXRvUHJvcGVydHlLZXkocik7YSBpbiBlP29iamVjdERlZmluZVByb3BlcnR5LmYoZSxhLGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigwLHQpKTplW2FdPXR9LFNQRUNJRVMkMT13ZWxsS25vd25TeW1ib2woXCJzcGVjaWVzXCIpLGFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGVuZ2luZVY4VmVyc2lvbj49NTF8fCFmYWlscygoZnVuY3Rpb24oKXt2YXIgcj1bXTtyZXR1cm4oci5jb25zdHJ1Y3Rvcj17fSlbU1BFQ0lFUyQxXT1mdW5jdGlvbigpe3JldHVybntmb286MX19LDEhPT1yW2VdKEJvb2xlYW4pLmZvb30pKX0sSEFTX1NQRUNJRVNfU1VQUE9SVCQxPWFycmF5TWV0aG9kSGFzU3BlY2llc1N1cHBvcnQoXCJzbGljZVwiKSxTUEVDSUVTPXdlbGxLbm93blN5bWJvbChcInNwZWNpZXNcIiksbmF0aXZlU2xpY2U9W10uc2xpY2UsbWF4JDE9TWF0aC5tYXg7X2V4cG9ydCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6IUhBU19TUEVDSUVTX1NVUFBPUlQkMX0se3NsaWNlOmZ1bmN0aW9uIHNsaWNlKGUscil7dmFyIHQsYSxpLHM9dG9JbmRleGVkT2JqZWN0KHRoaXMpLGM9dG9MZW5ndGgocy5sZW5ndGgpLGw9dG9BYnNvbHV0ZUluZGV4KGUsYyksdT10b0Fic29sdXRlSW5kZXgodm9pZCAwPT09cj9jOnIsYyk7aWYoaXNBcnJheShzKSYmKHQ9cy5jb25zdHJ1Y3RvciwoaXNDb25zdHJ1Y3Rvcih0KSYmKHQ9PT1BcnJheXx8aXNBcnJheSh0LnByb3RvdHlwZSkpfHxpc09iamVjdCh0KSYmbnVsbD09PSh0PXRbU1BFQ0lFU10pKSYmKHQ9dm9pZCAwKSx0PT09QXJyYXl8fHZvaWQgMD09PXQpKXJldHVybiBuYXRpdmVTbGljZS5jYWxsKHMsbCx1KTtmb3IoYT1uZXcodm9pZCAwPT09dD9BcnJheTp0KShtYXgkMSh1LWwsMCkpLGk9MDtsPHU7bCsrLGkrKylsIGluIHMmJmNyZWF0ZVByb3BlcnR5KGEsaSxzW2xdKTtyZXR1cm4gYS5sZW5ndGg9aSxhfX0pLHR5cGVkQXJyYXlDb25zdHJ1Y3RvcihcIlVpbnQzMlwiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkocix0LGEpe3JldHVybiBlKHRoaXMscix0LGEpfX0pKSx0eXBlZEFycmF5Q29uc3RydWN0b3IoXCJVaW50MTZcIiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KHIsdCxhKXtyZXR1cm4gZSh0aGlzLHIsdCxhKX19KSk7dmFyICRmaWx0ZXI9YXJyYXlJdGVyYXRpb24uZmlsdGVyLEhBU19TUEVDSUVTX1NVUFBPUlQ9YXJyYXlNZXRob2RIYXNTcGVjaWVzU3VwcG9ydChcImZpbHRlclwiKTtfZXhwb3J0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDohSEFTX1NQRUNJRVNfU1VQUE9SVH0se2ZpbHRlcjpmdW5jdGlvbiBmaWx0ZXIoZSl7cmV0dXJuICRmaWx0ZXIodGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgUFJPUEVSX0ZVTkNUSU9OX05BTUU9ZnVuY3Rpb25OYW1lLlBST1BFUixUT19TVFJJTkc9XCJ0b1N0cmluZ1wiLFJlZ0V4cFByb3RvdHlwZT1SZWdFeHAucHJvdG90eXBlLG5hdGl2ZVRvU3RyaW5nPVJlZ0V4cFByb3RvdHlwZVtUT19TVFJJTkddLE5PVF9HRU5FUklDPWZhaWxzKChmdW5jdGlvbigpe3JldHVyblwiL2EvYlwiIT1uYXRpdmVUb1N0cmluZy5jYWxsKHtzb3VyY2U6XCJhXCIsZmxhZ3M6XCJiXCJ9KX0pKSxJTkNPUlJFQ1RfTkFNRT1QUk9QRVJfRlVOQ1RJT05fTkFNRSYmbmF0aXZlVG9TdHJpbmcubmFtZSE9VE9fU1RSSU5HOyhOT1RfR0VORVJJQ3x8SU5DT1JSRUNUX05BTUUpJiZyZWRlZmluZShSZWdFeHAucHJvdG90eXBlLFRPX1NUUklORywoZnVuY3Rpb24gdG9TdHJpbmckMSgpe3ZhciBlPWFuT2JqZWN0KHRoaXMpLHI9dG9TdHJpbmcoZS5zb3VyY2UpLHQ9ZS5mbGFncztyZXR1cm5cIi9cIityK1wiL1wiK3RvU3RyaW5nKHZvaWQgMD09PXQmJmUgaW5zdGFuY2VvZiBSZWdFeHAmJiEoXCJmbGFnc1wiaW4gUmVnRXhwUHJvdG90eXBlKT9yZWdleHBGbGFncy5jYWxsKGUpOnQpfSkse3Vuc2FmZTohMH0pO3ZhciB0ZXN0PVtdLG5hdGl2ZVNvcnQ9dGVzdC5zb3J0LEZBSUxTX09OX1VOREVGSU5FRD1mYWlscygoZnVuY3Rpb24oKXt0ZXN0LnNvcnQodm9pZCAwKX0pKSxGQUlMU19PTl9OVUxMPWZhaWxzKChmdW5jdGlvbigpe3Rlc3Quc29ydChudWxsKX0pKSxTVFJJQ1RfTUVUSE9EJDE9YXJyYXlNZXRob2RJc1N0cmljdChcInNvcnRcIiksU1RBQkxFX1NPUlQ9IWZhaWxzKChmdW5jdGlvbigpe2lmKGVuZ2luZVY4VmVyc2lvbilyZXR1cm4gZW5naW5lVjhWZXJzaW9uPDcwO2lmKCEoZW5naW5lRmZWZXJzaW9uJiZlbmdpbmVGZlZlcnNpb24+Mykpe2lmKGVuZ2luZUlzSWVPckVkZ2UpcmV0dXJuITA7aWYoZW5naW5lV2Via2l0VmVyc2lvbilyZXR1cm4gZW5naW5lV2Via2l0VmVyc2lvbjw2MDM7dmFyIGUscix0LGEsaT1cIlwiO2ZvcihlPTY1O2U8NzY7ZSsrKXtzd2l0Y2gocj1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLGUpe2Nhc2UgNjY6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNzI6dD0zO2JyZWFrO2Nhc2UgNjg6Y2FzZSA3MTp0PTQ7YnJlYWs7ZGVmYXVsdDp0PTJ9Zm9yKGE9MDthPDQ3O2ErKyl0ZXN0LnB1c2goe2s6cithLHY6dH0pfWZvcih0ZXN0LnNvcnQoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHIudi1lLnZ9KSksYT0wO2E8dGVzdC5sZW5ndGg7YSsrKXI9dGVzdFthXS5rLmNoYXJBdCgwKSxpLmNoYXJBdChpLmxlbmd0aC0xKSE9PXImJihpKz1yKTtyZXR1cm5cIkRHQkVGSEFDSUpLXCIhPT1pfX0pKSxGT1JDRUQkMT1GQUlMU19PTl9VTkRFRklORUR8fCFGQUlMU19PTl9OVUxMfHwhU1RSSUNUX01FVEhPRCQxfHwhU1RBQkxFX1NPUlQsZ2V0U29ydENvbXBhcmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIHZvaWQgMD09PXQ/LTE6dm9pZCAwPT09cj8xOnZvaWQgMCE9PWU/K2Uocix0KXx8MDp0b1N0cmluZyhyKT50b1N0cmluZyh0KT8xOi0xfX07X2V4cG9ydCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6Rk9SQ0VEJDF9LHtzb3J0OmZ1bmN0aW9uIHNvcnQoZSl7dm9pZCAwIT09ZSYmYUNhbGxhYmxlKGUpO3ZhciByPXRvT2JqZWN0KHRoaXMpO2lmKFNUQUJMRV9TT1JUKXJldHVybiB2b2lkIDA9PT1lP25hdGl2ZVNvcnQuY2FsbChyKTpuYXRpdmVTb3J0LmNhbGwocixlKTt2YXIgdCxhLGk9W10scz10b0xlbmd0aChyLmxlbmd0aCk7Zm9yKGE9MDthPHM7YSsrKWEgaW4gciYmaS5wdXNoKHJbYV0pO2Zvcih0PShpPWFycmF5U29ydChpLGdldFNvcnRDb21wYXJlKGUpKSkubGVuZ3RoLGE9MDthPHQ7KXJbYV09aVthKytdO2Zvcig7YTxzOylkZWxldGUgclthKytdO3JldHVybiByfX0pO3ZhciBVWklQXzE9Y3JlYXRlQ29tbW9uanNNb2R1bGUoKGZ1bmN0aW9uKGUpe3ZhciByLHQsVVpJUD17fTtlLmV4cG9ydHM9VVpJUCxVWklQLnBhcnNlPWZ1bmN0aW9uKGUscil7Zm9yKHZhciB0PVVaSVAuYmluLnJlYWRVc2hvcnQsYT1VWklQLmJpbi5yZWFkVWludCxpPTAscz17fSxjPW5ldyBVaW50OEFycmF5KGUpLGw9Yy5sZW5ndGgtNDsxMDEwMTAyNTYhPWEoYyxsKTspbC0tO2k9bDtpKz00O3ZhciB1PXQoYyxpKz00KTt0KGMsaSs9Mik7dmFyIHA9YShjLGkrPTIpLGQ9YShjLGkrPTQpO2krPTQsaT1kO2Zvcih2YXIgaD0wO2g8dTtoKyspe2EoYyxpKSxpKz00LGkrPTQsaSs9NCxhKGMsaSs9NCk7cD1hKGMsaSs9NCk7dmFyIHk9YShjLGkrPTQpLEE9dChjLGkrPTQpLGc9dChjLGkrMiksdj10KGMsaSs0KTtpKz02O3ZhciBFPWEoYyxpKz04KTtpKz00LGkrPUErZyt2LFVaSVAuX3JlYWRMb2NhbChjLEUscyxwLHkscil9cmV0dXJuIHN9LFVaSVAuX3JlYWRMb2NhbD1mdW5jdGlvbihlLHIsdCxhLGkscyl7dmFyIGM9VVpJUC5iaW4ucmVhZFVzaG9ydCxsPVVaSVAuYmluLnJlYWRVaW50O2woZSxyKSxjKGUscis9NCksYyhlLHIrPTIpO3ZhciB1PWMoZSxyKz0yKTtsKGUscis9MiksbChlLHIrPTQpLHIrPTQ7dmFyIHA9YyhlLHIrPTgpLGQ9YyhlLHIrPTIpO3IrPTI7dmFyIGg9VVpJUC5iaW4ucmVhZFVURjgoZSxyLHApO2lmKHIrPXAscis9ZCxzKXRbaF09e3NpemU6aSxjc2l6ZTphfTtlbHNle3ZhciB5PW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLHIpO2lmKDA9PXUpdFtoXT1uZXcgVWludDhBcnJheSh5LmJ1ZmZlci5zbGljZShyLHIrYSkpO2Vsc2V7aWYoOCE9dSl0aHJvd1widW5rbm93biBjb21wcmVzc2lvbiBtZXRob2Q6IFwiK3U7dmFyIEE9bmV3IFVpbnQ4QXJyYXkoaSk7VVpJUC5pbmZsYXRlUmF3KHksQSksdFtoXT1BfX19LFVaSVAuaW5mbGF0ZVJhdz1mdW5jdGlvbihlLHIpe3JldHVybiBVWklQLkYuaW5mbGF0ZShlLHIpfSxVWklQLmluZmxhdGU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZVswXSxlWzFdLFVaSVAuaW5mbGF0ZVJhdyhuZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQrMixlLmxlbmd0aC02KSxyKX0sVVpJUC5kZWZsYXRlPWZ1bmN0aW9uKGUscil7bnVsbD09ciYmKHI9e2xldmVsOjZ9KTt2YXIgdD0wLGE9bmV3IFVpbnQ4QXJyYXkoNTArTWF0aC5mbG9vcigxLjEqZS5sZW5ndGgpKTthW3RdPTEyMCxhW3QrMV09MTU2LHQrPTIsdD1VWklQLkYuZGVmbGF0ZVJhdyhlLGEsdCxyLmxldmVsKTt2YXIgaT1VWklQLmFkbGVyKGUsMCxlLmxlbmd0aCk7cmV0dXJuIGFbdCswXT1pPj4+MjQmMjU1LGFbdCsxXT1pPj4+MTYmMjU1LGFbdCsyXT1pPj4+OCYyNTUsYVt0KzNdPWk+Pj4wJjI1NSxuZXcgVWludDhBcnJheShhLmJ1ZmZlciwwLHQrNCl9LFVaSVAuZGVmbGF0ZVJhdz1mdW5jdGlvbihlLHIpe251bGw9PXImJihyPXtsZXZlbDo2fSk7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoNTArTWF0aC5mbG9vcigxLjEqZS5sZW5ndGgpKSxhPVVaSVAuRi5kZWZsYXRlUmF3KGUsdCxhLHIubGV2ZWwpO3JldHVybiBuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwwLGEpfSxVWklQLmVuY29kZT1mdW5jdGlvbihlLHIpe251bGw9PXImJihyPSExKTt2YXIgdD0wLGE9VVpJUC5iaW4ud3JpdGVVaW50LGk9VVpJUC5iaW4ud3JpdGVVc2hvcnQscz17fTtmb3IodmFyIGMgaW4gZSl7dmFyIGw9IVVaSVAuX25vTmVlZChjKSYmIXIsdT1lW2NdLHA9VVpJUC5jcmMuY3JjKHUsMCx1Lmxlbmd0aCk7c1tjXT17Y3ByOmwsdXNpemU6dS5sZW5ndGgsY3JjOnAsZmlsZTpsP1VaSVAuZGVmbGF0ZVJhdyh1KTp1fX1mb3IodmFyIGMgaW4gcyl0Kz1zW2NdLmZpbGUubGVuZ3RoKzMwKzQ2KzIqVVpJUC5iaW4uc2l6ZVVURjgoYyk7dCs9MjI7dmFyIGQ9bmV3IFVpbnQ4QXJyYXkodCksaD0wLHk9W107Zm9yKHZhciBjIGluIHMpe3ZhciBBPXNbY107eS5wdXNoKGgpLGg9VVpJUC5fd3JpdGVIZWFkZXIoZCxoLGMsQSwwKX12YXIgZz0wLHY9aDtmb3IodmFyIGMgaW4gcyl7QT1zW2NdO3kucHVzaChoKSxoPVVaSVAuX3dyaXRlSGVhZGVyKGQsaCxjLEEsMSx5W2crK10pfXZhciBFPWgtdjtyZXR1cm4gYShkLGgsMTAxMDEwMjU2KSxoKz00LGkoZCxoKz00LGcpLGkoZCxoKz0yLGcpLGEoZCxoKz0yLEUpLGEoZCxoKz00LHYpLGgrPTQsaCs9MixkLmJ1ZmZlcn0sVVpJUC5fbm9OZWVkPWZ1bmN0aW9uKGUpe3ZhciByPWUuc3BsaXQoXCIuXCIpLnBvcCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuLTEhPVwicG5nLGpwZyxqcGVnLHppcFwiLmluZGV4T2Yocil9LFVaSVAuX3dyaXRlSGVhZGVyPWZ1bmN0aW9uKGUscix0LGEsaSxzKXt2YXIgYz1VWklQLmJpbi53cml0ZVVpbnQsbD1VWklQLmJpbi53cml0ZVVzaG9ydCx1PWEuZmlsZTtyZXR1cm4gYyhlLHIsMD09aT82NzMyNDc1MjozMzYzOTI0OCkscis9NCwxPT1pJiYocis9MiksbChlLHIsMjApLGwoZSxyKz0yLDApLGwoZSxyKz0yLGEuY3ByPzg6MCksYyhlLHIrPTIsMCksYyhlLHIrPTQsYS5jcmMpLGMoZSxyKz00LHUubGVuZ3RoKSxjKGUscis9NCxhLnVzaXplKSxsKGUscis9NCxVWklQLmJpbi5zaXplVVRGOCh0KSksbChlLHIrPTIsMCkscis9MiwxPT1pJiYocis9MixyKz0yLGMoZSxyKz02LHMpLHIrPTQpLHIrPVVaSVAuYmluLndyaXRlVVRGOChlLHIsdCksMD09aSYmKGUuc2V0KHUscikscis9dS5sZW5ndGgpLHJ9LFVaSVAuY3JjPXt0YWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1uZXcgVWludDMyQXJyYXkoMjU2KSxyPTA7cjwyNTY7cisrKXtmb3IodmFyIHQ9cixhPTA7YTw4O2ErKykxJnQ/dD0zOTg4MjkyMzg0XnQ+Pj4xOnQ+Pj49MTtlW3JdPXR9cmV0dXJuIGV9KCksdXBkYXRlOmZ1bmN0aW9uKGUscix0LGEpe2Zvcih2YXIgaT0wO2k8YTtpKyspZT1VWklQLmNyYy50YWJsZVsyNTUmKGVeclt0K2ldKV1eZT4+Pjg7cmV0dXJuIGV9LGNyYzpmdW5jdGlvbihlLHIsdCl7cmV0dXJuIDQyOTQ5NjcyOTVeVVpJUC5jcmMudXBkYXRlKDQyOTQ5NjcyOTUsZSxyLHQpfX0sVVpJUC5hZGxlcj1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhPTEsaT0wLHM9cixjPXIrdDtzPGM7KXtmb3IodmFyIGw9TWF0aC5taW4ocys1NTUyLGMpO3M8bDspaSs9YSs9ZVtzKytdO2ElPTY1NTIxLGklPTY1NTIxfXJldHVybiBpPDwxNnxhfSxVWklQLmJpbj17cmVhZFVzaG9ydDpmdW5jdGlvbihlLHIpe3JldHVybiBlW3JdfGVbcisxXTw8OH0sd3JpdGVVc2hvcnQ6ZnVuY3Rpb24oZSxyLHQpe2Vbcl09MjU1JnQsZVtyKzFdPXQ+PjgmMjU1fSxyZWFkVWludDpmdW5jdGlvbihlLHIpe3JldHVybiAxNjc3NzIxNiplW3IrM10rKGVbcisyXTw8MTZ8ZVtyKzFdPDw4fGVbcl0pfSx3cml0ZVVpbnQ6ZnVuY3Rpb24oZSxyLHQpe2Vbcl09MjU1JnQsZVtyKzFdPXQ+PjgmMjU1LGVbcisyXT10Pj4xNiYyNTUsZVtyKzNdPXQ+PjI0JjI1NX0scmVhZEFTQ0lJOmZ1bmN0aW9uKGUscix0KXtmb3IodmFyIGE9XCJcIixpPTA7aTx0O2krKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcitpXSk7cmV0dXJuIGF9LHdyaXRlQVNDSUk6ZnVuY3Rpb24oZSxyLHQpe2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWVbcithXT10LmNoYXJDb2RlQXQoYSl9LHBhZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGg8Mj9cIjBcIitlOmV9LHJlYWRVVEY4OmZ1bmN0aW9uKGUscix0KXtmb3IodmFyIGEsaT1cIlwiLHM9MDtzPHQ7cysrKWkrPVwiJVwiK1VaSVAuYmluLnBhZChlW3Irc10udG9TdHJpbmcoMTYpKTt0cnl7YT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2goYSl7cmV0dXJuIFVaSVAuYmluLnJlYWRBU0NJSShlLHIsdCl9cmV0dXJuIGF9LHdyaXRlVVRGODpmdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhPXQubGVuZ3RoLGk9MCxzPTA7czxhO3MrKyl7dmFyIGM9dC5jaGFyQ29kZUF0KHMpO2lmKDA9PSg0Mjk0OTY3MTY4JmMpKWVbcitpXT1jLGkrKztlbHNlIGlmKDA9PSg0Mjk0OTY1MjQ4JmMpKWVbcitpXT0xOTJ8Yz4+NixlW3IraSsxXT0xMjh8Yz4+MCY2MyxpKz0yO2Vsc2UgaWYoMD09KDQyOTQ5MDE3NjAmYykpZVtyK2ldPTIyNHxjPj4xMixlW3IraSsxXT0xMjh8Yz4+NiY2MyxlW3IraSsyXT0xMjh8Yz4+MCY2MyxpKz0zO2Vsc2V7aWYoMCE9KDQyOTI4NzAxNDQmYykpdGhyb3dcImVcIjtlW3IraV09MjQwfGM+PjE4LGVbcitpKzFdPTEyOHxjPj4xMiY2MyxlW3IraSsyXT0xMjh8Yz4+NiY2MyxlW3IraSszXT0xMjh8Yz4+MCY2MyxpKz00fX1yZXR1cm4gaX0sc2l6ZVVURjg6ZnVuY3Rpb24oZSl7Zm9yKHZhciByPWUubGVuZ3RoLHQ9MCxhPTA7YTxyO2ErKyl7dmFyIGk9ZS5jaGFyQ29kZUF0KGEpO2lmKDA9PSg0Mjk0OTY3MTY4JmkpKXQrKztlbHNlIGlmKDA9PSg0Mjk0OTY1MjQ4JmkpKXQrPTI7ZWxzZSBpZigwPT0oNDI5NDkwMTc2MCZpKSl0Kz0zO2Vsc2V7aWYoMCE9KDQyOTI4NzAxNDQmaSkpdGhyb3dcImVcIjt0Kz00fX1yZXR1cm4gdH19LFVaSVAuRj17fSxVWklQLkYuZGVmbGF0ZVJhdz1mdW5jdGlvbihlLHIsdCxhKXt2YXIgaT1bWzAsMCwwLDAsMF0sWzQsNCw4LDQsMF0sWzQsNSwxNiw4LDBdLFs0LDYsMTYsMTYsMF0sWzQsMTAsMTYsMzIsMF0sWzgsMTYsMzIsMzIsMF0sWzgsMTYsMTI4LDEyOCwwXSxbOCwzMiwxMjgsMjU2LDBdLFszMiwxMjgsMjU4LDEwMjQsMV0sWzMyLDI1OCwyNTgsNDA5NiwxXV1bYV0scz1VWklQLkYuVSxjPVVaSVAuRi5fZ29vZEluZGV4O1VaSVAuRi5faGFzaDt2YXIgbD1VWklQLkYuX3B1dHNFLHU9MCxwPXQ8PDMsZD0wLGg9ZS5sZW5ndGg7aWYoMD09YSl7Zm9yKDt1PGg7KXtsKHIscCx1KyhSPU1hdGgubWluKDY1NTM1LGgtdSkpPT1oPzE6MCkscD1VWklQLkYuX2NvcHlFeGFjdChlLHUsUixyLHArOCksdSs9Un1yZXR1cm4gcD4+PjN9dmFyIHk9cy5saXRzLEE9cy5zdHJ0LGc9cy5wcmV2LHY9MCxFPTAsbT0wLEk9MCxQPTAsYj0wO2ZvcihoPjImJihBW2I9VVpJUC5GLl9oYXNoKGUsMCldPTApLHU9MDt1PGg7dSsrKXtpZihQPWIsdSsxPGgtMil7Yj1VWklQLkYuX2hhc2goZSx1KzEpO3ZhciBUPXUrMSYzMjc2NztnW1RdPUFbYl0sQVtiXT1UfWlmKGQ8PXUpeyh2PjE0ZTN8fEU+MjY2OTcpJiZoLXU+MTAwJiYoZDx1JiYoeVt2XT11LWQsdis9MixkPXUpLHA9VVpJUC5GLl93cml0ZUJsb2NrKHU9PWgtMXx8ZD09aD8xOjAseSx2LEksZSxtLHUtbSxyLHApLHY9RT1JPTAsbT11KTt2YXIgUz0wO3U8aC0yJiYoUz1VWklQLkYuX2Jlc3RNYXRjaChlLHUsZyxQLE1hdGgubWluKGlbMl0saC11KSxpWzNdKSk7dmFyIFI9Uz4+PjE2LF89NjU1MzUmUztpZigwIT1TKXtfPTY1NTM1JlM7dmFyIFU9YyhSPVM+Pj4xNixzLm9mMCk7cy5saHN0WzI1NytVXSsrO3ZhciB3PWMoXyxzLmRmMCk7cy5kaHN0W3ddKyssSSs9cy5leGJbVV0rcy5keGJbd10seVt2XT1SPDwyM3x1LWQseVt2KzFdPV88PDE2fFU8PDh8dyx2Kz0yLGQ9dStSfWVsc2Ugcy5saHN0W2VbdV1dKys7RSsrfX1mb3IobT09dSYmMCE9ZS5sZW5ndGh8fChkPHUmJih5W3ZdPXUtZCx2Kz0yLGQ9dSkscD1VWklQLkYuX3dyaXRlQmxvY2soMSx5LHYsSSxlLG0sdS1tLHIscCksdj0wLEU9MCx2PUU9ST0wLG09dSk7MCE9KDcmcCk7KXArKztyZXR1cm4gcD4+PjN9LFVaSVAuRi5fYmVzdE1hdGNoPWZ1bmN0aW9uKGUscix0LGEsaSxzKXt2YXIgYz0zMjc2NyZyLGw9dFtjXSx1PWMtbCszMjc2OCYzMjc2NztpZihsPT1jfHxhIT1VWklQLkYuX2hhc2goZSxyLXUpKXJldHVybiAwO2Zvcih2YXIgcD0wLGQ9MCxoPU1hdGgubWluKDMyNzY3LHIpO3U8PWgmJjAhPS0tcyYmbCE9Yzspe2lmKDA9PXB8fGVbcitwXT09ZVtyK3AtdV0pe3ZhciB5PVVaSVAuRi5faG93TG9uZyhlLHIsdSk7aWYoeT5wKXtpZihkPXUsKHA9eSk+PWkpYnJlYWs7dSsyPHkmJih5PXUrMik7Zm9yKHZhciBBPTAsZz0wO2c8eS0yO2crKyl7dmFyIHY9ci11K2crMzI3NjgmMzI3NjcsRT12LXRbdl0rMzI3NjgmMzI3Njc7RT5BJiYoQT1FLGw9dil9fX11Kz0oYz1sKS0obD10W2NdKSszMjc2OCYzMjc2N31yZXR1cm4gcDw8MTZ8ZH0sVVpJUC5GLl9ob3dMb25nPWZ1bmN0aW9uKGUscix0KXtpZihlW3JdIT1lW3ItdF18fGVbcisxXSE9ZVtyKzEtdF18fGVbcisyXSE9ZVtyKzItdF0pcmV0dXJuIDA7dmFyIGE9cixpPU1hdGgubWluKGUubGVuZ3RoLHIrMjU4KTtmb3Iocis9MztyPGkmJmVbcl09PWVbci10XTspcisrO3JldHVybiByLWF9LFVaSVAuRi5faGFzaD1mdW5jdGlvbihlLHIpe3JldHVybihlW3JdPDw4fGVbcisxXSkrKGVbcisyXTw8NCkmNjU1MzV9LFVaSVAuc2F2ZWQ9MCxVWklQLkYuX3dyaXRlQmxvY2s9ZnVuY3Rpb24oZSxyLHQsYSxpLHMsYyxsLHUpe3ZhciBwLGQsaCx5LEEsZyx2LEUsbSxJPVVaSVAuRi5VLFA9VVpJUC5GLl9wdXRzRixiPVVaSVAuRi5fcHV0c0U7SS5saHN0WzI1Nl0rKyxkPShwPVVaSVAuRi5nZXRUcmVlcygpKVswXSxoPXBbMV0seT1wWzJdLEE9cFszXSxnPXBbNF0sdj1wWzVdLEU9cFs2XSxtPXBbN107dmFyIFQ9MzIrKDA9PSh1KzMmNyk/MDo4LSh1KzMmNykpKyhjPDwzKSxTPWErVVpJUC5GLmNvbnRTaXplKEkuZmx0cmVlLEkubGhzdCkrVVpJUC5GLmNvbnRTaXplKEkuZmR0cmVlLEkuZGhzdCksUj1hK1VaSVAuRi5jb250U2l6ZShJLmx0cmVlLEkubGhzdCkrVVpJUC5GLmNvbnRTaXplKEkuZHRyZWUsSS5kaHN0KTtSKz0xNCszKnYrVVpJUC5GLmNvbnRTaXplKEkuaXRyZWUsSS5paHN0KSsoMipJLmloc3RbMTZdKzMqSS5paHN0WzE3XSs3KkkuaWhzdFsxOF0pO2Zvcih2YXIgXz0wO188Mjg2O18rKylJLmxoc3RbX109MDtmb3IoXz0wO188MzA7XysrKUkuZGhzdFtfXT0wO2ZvcihfPTA7XzwxOTtfKyspSS5paHN0W19dPTA7dmFyIFU9VDxTJiZUPFI/MDpTPFI/MToyO2lmKFAobCx1LGUpLFAobCx1KzEsVSksdSs9MywwPT1VKXtmb3IoOzAhPSg3JnUpOyl1Kys7dT1VWklQLkYuX2NvcHlFeGFjdChpLHMsYyxsLHUpfWVsc2V7dmFyIHcsTztpZigxPT1VJiYodz1JLmZsdHJlZSxPPUkuZmR0cmVlKSwyPT1VKXtVWklQLkYubWFrZUNvZGVzKEkubHRyZWUsZCksVVpJUC5GLnJldkNvZGVzKEkubHRyZWUsZCksVVpJUC5GLm1ha2VDb2RlcyhJLmR0cmVlLGgpLFVaSVAuRi5yZXZDb2RlcyhJLmR0cmVlLGgpLFVaSVAuRi5tYWtlQ29kZXMoSS5pdHJlZSx5KSxVWklQLkYucmV2Q29kZXMoSS5pdHJlZSx5KSx3PUkubHRyZWUsTz1JLmR0cmVlLGIobCx1LEEtMjU3KSxiKGwsdSs9NSxnLTEpLGIobCx1Kz01LHYtNCksdSs9NDtmb3IodmFyIEM9MDtDPHY7QysrKWIobCx1KzMqQyxJLml0cmVlWzErKEkub3JkcltDXTw8MSldKTt1Kz0zKnYsdT1VWklQLkYuX2NvZGVUaW55KEUsSS5pdHJlZSxsLHUpLHU9VVpJUC5GLl9jb2RlVGlueShtLEkuaXRyZWUsbCx1KX1mb3IodmFyICQ9cyxMPTA7TDx0O0wrPTIpe2Zvcih2YXIgeD1yW0xdLE09eD4+PjIzLEI9JCsoODM4ODYwNyZ4KTskPEI7KXU9VVpJUC5GLl93cml0ZUxpdChpWyQrK10sdyxsLHUpO2lmKDAhPU0pe3ZhciBEPXJbTCsxXSxHPUQ+PjE2LFY9RD4+OCYyNTUsaz0yNTUmRDtiKGwsdT1VWklQLkYuX3dyaXRlTGl0KDI1NytWLHcsbCx1KSxNLUkub2YwW1ZdKSx1Kz1JLmV4YltWXSxQKGwsdT1VWklQLkYuX3dyaXRlTGl0KGssTyxsLHUpLEctSS5kZjBba10pLHUrPUkuZHhiW2tdLCQrPU19fXU9VVpJUC5GLl93cml0ZUxpdCgyNTYsdyxsLHUpfXJldHVybiB1fSxVWklQLkYuX2NvcHlFeGFjdD1mdW5jdGlvbihlLHIsdCxhLGkpe3ZhciBzPWk+Pj4zO3JldHVybiBhW3NdPXQsYVtzKzFdPXQ+Pj44LGFbcysyXT0yNTUtYVtzXSxhW3MrM109MjU1LWFbcysxXSxzKz00LGEuc2V0KG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLHIsdCkscyksaSsodCs0PDwzKX0sVVpJUC5GLmdldFRyZWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVVaSVAuRi5VLHI9VVpJUC5GLl9odWZUcmVlKGUubGhzdCxlLmx0cmVlLDE1KSx0PVVaSVAuRi5faHVmVHJlZShlLmRoc3QsZS5kdHJlZSwxNSksYT1bXSxpPVVaSVAuRi5fbGVuQ29kZXMoZS5sdHJlZSxhKSxzPVtdLGM9VVpJUC5GLl9sZW5Db2RlcyhlLmR0cmVlLHMpLGw9MDtsPGEubGVuZ3RoO2wrPTIpZS5paHN0W2FbbF1dKys7Zm9yKGw9MDtsPHMubGVuZ3RoO2wrPTIpZS5paHN0W3NbbF1dKys7Zm9yKHZhciB1PVVaSVAuRi5faHVmVHJlZShlLmloc3QsZS5pdHJlZSw3KSxwPTE5O3A+NCYmMD09ZS5pdHJlZVsxKyhlLm9yZHJbcC0xXTw8MSldOylwLS07cmV0dXJuW3IsdCx1LGksYyxwLGEsc119LFVaSVAuRi5nZXRTZWNvbmQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPVtdLHQ9MDt0PGUubGVuZ3RoO3QrPTIpci5wdXNoKGVbdCsxXSk7cmV0dXJuIHJ9LFVaSVAuRi5ub25aZXJvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj1cIlwiLHQ9MDt0PGUubGVuZ3RoO3QrPTIpMCE9ZVt0KzFdJiYocis9KHQ+PjEpK1wiLFwiKTtyZXR1cm4gcn0sVVpJUC5GLmNvbnRTaXplPWZ1bmN0aW9uKGUscil7Zm9yKHZhciB0PTAsYT0wO2E8ci5sZW5ndGg7YSsrKXQrPXJbYV0qZVsxKyhhPDwxKV07cmV0dXJuIHR9LFVaSVAuRi5fY29kZVRpbnk9ZnVuY3Rpb24oZSxyLHQsYSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKz0yKXt2YXIgcz1lW2ldLGM9ZVtpKzFdO2E9VVpJUC5GLl93cml0ZUxpdChzLHIsdCxhKTt2YXIgbD0xNj09cz8yOjE3PT1zPzM6NztzPjE1JiYoVVpJUC5GLl9wdXRzRSh0LGEsYyxsKSxhKz1sKX1yZXR1cm4gYX0sVVpJUC5GLl9sZW5Db2Rlcz1mdW5jdGlvbihlLHIpe2Zvcih2YXIgdD1lLmxlbmd0aDsyIT10JiYwPT1lW3QtMV07KXQtPTI7Zm9yKHZhciBhPTA7YTx0O2ErPTIpe3ZhciBpPWVbYSsxXSxzPWErMzx0P2VbYSszXTotMSxjPWErNTx0P2VbYSs1XTotMSxsPTA9PWE/LTE6ZVthLTFdO2lmKDA9PWkmJnM9PWkmJmM9PWkpe2Zvcih2YXIgdT1hKzU7dSsyPHQmJmVbdSsyXT09aTspdSs9MjsocD1NYXRoLm1pbih1KzEtYT4+PjEsMTM4KSk8MTE/ci5wdXNoKDE3LHAtMyk6ci5wdXNoKDE4LHAtMTEpLGErPTIqcC0yfWVsc2UgaWYoaT09bCYmcz09aSYmYz09aSl7Zm9yKHU9YSs1O3UrMjx0JiZlW3UrMl09PWk7KXUrPTI7dmFyIHA9TWF0aC5taW4odSsxLWE+Pj4xLDYpO3IucHVzaCgxNixwLTMpLGErPTIqcC0yfWVsc2Ugci5wdXNoKGksMCl9cmV0dXJuIHQ+Pj4xfSxVWklQLkYuX2h1ZlRyZWU9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhPVtdLGk9ZS5sZW5ndGgscz1yLmxlbmd0aCxjPTA7Zm9yKGM9MDtjPHM7Yys9MilyW2NdPTAscltjKzFdPTA7Zm9yKGM9MDtjPGk7YysrKTAhPWVbY10mJmEucHVzaCh7bGl0OmMsZjplW2NdfSk7dmFyIGw9YS5sZW5ndGgsdT1hLnNsaWNlKDApO2lmKDA9PWwpcmV0dXJuIDA7aWYoMT09bCl7dmFyIHA9YVswXS5saXQ7dT0wPT1wPzE6MDtyZXR1cm4gclsxKyhwPDwxKV09MSxyWzErKHU8PDEpXT0xLDF9YS5zb3J0KChmdW5jdGlvbihlLHIpe3JldHVybiBlLmYtci5mfSkpO3ZhciBkPWFbMF0saD1hWzFdLHk9MCxBPTEsZz0yO2ZvcihhWzBdPXtsaXQ6LTEsZjpkLmYraC5mLGw6ZCxyOmgsZDowfTtBIT1sLTE7KWQ9eSE9QSYmKGc9PWx8fGFbeV0uZjxhW2ddLmYpP2FbeSsrXTphW2crK10saD15IT1BJiYoZz09bHx8YVt5XS5mPGFbZ10uZik/YVt5KytdOmFbZysrXSxhW0ErK109e2xpdDotMSxmOmQuZitoLmYsbDpkLHI6aH07dmFyIHY9VVpJUC5GLnNldERlcHRoKGFbQS0xXSwwKTtmb3Iodj50JiYoVVpJUC5GLnJlc3RyaWN0RGVwdGgodSx0LHYpLHY9dCksYz0wO2M8bDtjKyspclsxKyh1W2NdLmxpdDw8MSldPXVbY10uZDtyZXR1cm4gdn0sVVpJUC5GLnNldERlcHRoPWZ1bmN0aW9uKGUscil7cmV0dXJuLTEhPWUubGl0PyhlLmQ9cixyKTpNYXRoLm1heChVWklQLkYuc2V0RGVwdGgoZS5sLHIrMSksVVpJUC5GLnNldERlcHRoKGUucixyKzEpKX0sVVpJUC5GLnJlc3RyaWN0RGVwdGg9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhPTAsaT0xPDx0LXIscz0wO2ZvcihlLnNvcnQoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHIuZD09ZS5kP2UuZi1yLmY6ci5kLWUuZH0pKSxhPTA7YTxlLmxlbmd0aCYmZVthXS5kPnI7YSsrKXt2YXIgYz1lW2FdLmQ7ZVthXS5kPXIscys9aS0oMTw8dC1jKX1mb3Iocz4+Pj10LXI7cz4wOyl7KGM9ZVthXS5kKTxyPyhlW2FdLmQrKyxzLT0xPDxyLWMtMSk6YSsrfWZvcig7YT49MDthLS0pZVthXS5kPT1yJiZzPDAmJihlW2FdLmQtLSxzKyspOzAhPXMmJmNvbnNvbGUubG9nKFwiZGVidCBsZWZ0XCIpfSxVWklQLkYuX2dvb2RJbmRleD1mdW5jdGlvbihlLHIpe3ZhciB0PTA7cmV0dXJuIHJbMTZ8dF08PWUmJih0fD0xNikscls4fHRdPD1lJiYodHw9OCkscls0fHRdPD1lJiYodHw9NCksclsyfHRdPD1lJiYodHw9MiksclsxfHRdPD1lJiYodHw9MSksdH0sVVpJUC5GLl93cml0ZUxpdD1mdW5jdGlvbihlLHIsdCxhKXtyZXR1cm4gVVpJUC5GLl9wdXRzRih0LGEscltlPDwxXSksYStyWzErKGU8PDEpXX0sVVpJUC5GLmluZmxhdGU9ZnVuY3Rpb24oZSxyKXt2YXIgdD1VaW50OEFycmF5O2lmKDM9PWVbMF0mJjA9PWVbMV0pcmV0dXJuIHJ8fG5ldyB0KDApO3ZhciBhPVVaSVAuRixpPWEuX2JpdHNGLHM9YS5fYml0c0UsYz1hLl9kZWNvZGVUaW55LGw9YS5tYWtlQ29kZXMsdT1hLmNvZGVzMm1hcCxwPWEuX2dldDE3LGQ9YS5VLGg9bnVsbD09cjtoJiYocj1uZXcgdChlLmxlbmd0aD4+PjI8PDMpKTtmb3IodmFyIHksQSxnPTAsdj0wLEU9MCxtPTAsST0wLFA9MCxiPTAsVD0wLFM9MDswPT1nOylpZihnPWkoZSxTLDEpLHY9aShlLFMrMSwyKSxTKz0zLDAhPXYpe2lmKGgmJihyPVVaSVAuRi5fY2hlY2socixUKygxPDwxNykpKSwxPT12JiYoeT1kLmZsbWFwLEE9ZC5mZG1hcCxQPTUxMSxiPTMxKSwyPT12KXtFPXMoZSxTLDUpKzI1NyxtPXMoZSxTKzUsNSkrMSxJPXMoZSxTKzEwLDQpKzQsUys9MTQ7Zm9yKHZhciBSPTA7UjwzODtSKz0yKWQuaXRyZWVbUl09MCxkLml0cmVlW1IrMV09MDt2YXIgXz0xO2ZvcihSPTA7UjxJO1IrKyl7dmFyIFU9cyhlLFMrMypSLDMpO2QuaXRyZWVbMSsoZC5vcmRyW1JdPDwxKV09VSxVPl8mJihfPVUpfVMrPTMqSSxsKGQuaXRyZWUsXyksdShkLml0cmVlLF8sZC5pbWFwKSx5PWQubG1hcCxBPWQuZG1hcCxTPWMoZC5pbWFwLCgxPDxfKS0xLEUrbSxlLFMsZC50dHJlZSk7dmFyIHc9YS5fY29weU91dChkLnR0cmVlLDAsRSxkLmx0cmVlKTtQPSgxPDx3KS0xO3ZhciBPPWEuX2NvcHlPdXQoZC50dHJlZSxFLG0sZC5kdHJlZSk7Yj0oMTw8TyktMSxsKGQubHRyZWUsdyksdShkLmx0cmVlLHcseSksbChkLmR0cmVlLE8pLHUoZC5kdHJlZSxPLEEpfWZvcig7Oyl7dmFyIEM9eVtwKGUsUykmUF07Uys9MTUmQzt2YXIgJD1DPj4+NDtpZigkPj4+OD09MClyW1QrK109JDtlbHNle2lmKDI1Nj09JClicmVhazt2YXIgTD1UKyQtMjU0O2lmKCQ+MjY0KXt2YXIgeD1kLmxkZWZbJC0yNTddO0w9VCsoeD4+PjMpK3MoZSxTLDcmeCksUys9NyZ4fXZhciBNPUFbcChlLFMpJmJdO1MrPTE1Jk07dmFyIEI9TT4+PjQsRD1kLmRkZWZbQl0sRz0oRD4+PjQpK2koZSxTLDE1JkQpO2ZvcihTKz0xNSZELGgmJihyPVVaSVAuRi5fY2hlY2socixUKygxPDwxNykpKTtUPEw7KXJbVF09cltUKystR10scltUXT1yW1QrKy1HXSxyW1RdPXJbVCsrLUddLHJbVF09cltUKystR107VD1MfX19ZWxzZXswIT0oNyZTKSYmKFMrPTgtKDcmUykpO3ZhciBWPTQrKFM+Pj4zKSxrPWVbVi00XXxlW1YtM108PDg7aCYmKHI9VVpJUC5GLl9jaGVjayhyLFQraykpLHIuc2V0KG5ldyB0KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCtWLGspLFQpLFM9VitrPDwzLFQrPWt9cmV0dXJuIHIubGVuZ3RoPT1UP3I6ci5zbGljZSgwLFQpfSxVWklQLkYuX2NoZWNrPWZ1bmN0aW9uKGUscil7dmFyIHQ9ZS5sZW5ndGg7aWYocjw9dClyZXR1cm4gZTt2YXIgYT1uZXcgVWludDhBcnJheShNYXRoLm1heCh0PDwxLHIpKTtyZXR1cm4gYS5zZXQoZSwwKSxhfSxVWklQLkYuX2RlY29kZVRpbnk9ZnVuY3Rpb24oZSxyLHQsYSxpLHMpe2Zvcih2YXIgYz1VWklQLkYuX2JpdHNFLGw9VVpJUC5GLl9nZXQxNyx1PTA7dTx0Oyl7dmFyIHA9ZVtsKGEsaSkmcl07aSs9MTUmcDt2YXIgZD1wPj4+NDtpZihkPD0xNSlzW3VdPWQsdSsrO2Vsc2V7dmFyIGg9MCx5PTA7MTY9PWQ/KHk9MytjKGEsaSwyKSxpKz0yLGg9c1t1LTFdKToxNz09ZD8oeT0zK2MoYSxpLDMpLGkrPTMpOjE4PT1kJiYoeT0xMStjKGEsaSw3KSxpKz03KTtmb3IodmFyIEE9dSt5O3U8QTspc1t1XT1oLHUrK319cmV0dXJuIGl9LFVaSVAuRi5fY29weU91dD1mdW5jdGlvbihlLHIsdCxhKXtmb3IodmFyIGk9MCxzPTAsYz1hLmxlbmd0aD4+PjE7czx0Oyl7dmFyIGw9ZVtzK3JdO2Fbczw8MV09MCxhWzErKHM8PDEpXT1sLGw+aSYmKGk9bCkscysrfWZvcig7czxjOylhW3M8PDFdPTAsYVsxKyhzPDwxKV09MCxzKys7cmV0dXJuIGl9LFVaSVAuRi5tYWtlQ29kZXM9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIHQsYSxpLHMsYz1VWklQLkYuVSxsPWUubGVuZ3RoLHU9Yy5ibF9jb3VudCxwPTA7cDw9cjtwKyspdVtwXT0wO2ZvcihwPTE7cDxsO3ArPTIpdVtlW3BdXSsrO3ZhciBkPWMubmV4dF9jb2RlO2Zvcih0PTAsdVswXT0wLGE9MTthPD1yO2ErKyl0PXQrdVthLTFdPDwxLGRbYV09dDtmb3IoaT0wO2k8bDtpKz0yKTAhPShzPWVbaSsxXSkmJihlW2ldPWRbc10sZFtzXSsrKX0sVVpJUC5GLmNvZGVzMm1hcD1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhPWUubGVuZ3RoLGk9VVpJUC5GLlUucmV2MTUscz0wO3M8YTtzKz0yKWlmKDAhPWVbcysxXSlmb3IodmFyIGM9cz4+MSxsPWVbcysxXSx1PWM8PDR8bCxwPXItbCxkPWVbc108PHAsaD1kKygxPDxwKTtkIT1oOyl7dFtpW2RdPj4+MTUtcl09dSxkKyt9fSxVWklQLkYucmV2Q29kZXM9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIHQ9VVpJUC5GLlUucmV2MTUsYT0xNS1yLGk9MDtpPGUubGVuZ3RoO2krPTIpe3ZhciBzPWVbaV08PHItZVtpKzFdO2VbaV09dFtzXT4+PmF9fSxVWklQLkYuX3B1dHNFPWZ1bmN0aW9uKGUscix0KXt0PDw9NyZyO3ZhciBhPXI+Pj4zO2VbYV18PXQsZVthKzFdfD10Pj4+OH0sVVpJUC5GLl9wdXRzRj1mdW5jdGlvbihlLHIsdCl7dDw8PTcmcjt2YXIgYT1yPj4+MztlW2FdfD10LGVbYSsxXXw9dD4+PjgsZVthKzJdfD10Pj4+MTZ9LFVaSVAuRi5fYml0c0U9ZnVuY3Rpb24oZSxyLHQpe3JldHVybihlW3I+Pj4zXXxlWzErKHI+Pj4zKV08PDgpPj4+KDcmcikmKDE8PHQpLTF9LFVaSVAuRi5fYml0c0Y9ZnVuY3Rpb24oZSxyLHQpe3JldHVybihlW3I+Pj4zXXxlWzErKHI+Pj4zKV08PDh8ZVsyKyhyPj4+MyldPDwxNik+Pj4oNyZyKSYoMTw8dCktMX0sVVpJUC5GLl9nZXQxNz1mdW5jdGlvbihlLHIpe3JldHVybihlW3I+Pj4zXXxlWzErKHI+Pj4zKV08PDh8ZVsyKyhyPj4+MyldPDwxNik+Pj4oNyZyKX0sVVpJUC5GLl9nZXQyNT1mdW5jdGlvbihlLHIpe3JldHVybihlW3I+Pj4zXXxlWzErKHI+Pj4zKV08PDh8ZVsyKyhyPj4+MyldPDwxNnxlWzMrKHI+Pj4zKV08PDI0KT4+Pig3JnIpfSxVWklQLkYuVT0ocj1VaW50MTZBcnJheSx0PVVpbnQzMkFycmF5LHtuZXh0X2NvZGU6bmV3IHIoMTYpLGJsX2NvdW50Om5ldyByKDE2KSxvcmRyOlsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxvZjA6WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsOTk5LDk5OSw5OTldLGV4YjpbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMCwwXSxsZGVmOm5ldyByKDMyKSxkZjA6WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3Nyw2NTUzNSw2NTUzNV0sZHhiOlswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzLDAsMF0sZGRlZjpuZXcgdCgzMiksZmxtYXA6bmV3IHIoNTEyKSxmbHRyZWU6W10sZmRtYXA6bmV3IHIoMzIpLGZkdHJlZTpbXSxsbWFwOm5ldyByKDMyNzY4KSxsdHJlZTpbXSx0dHJlZTpbXSxkbWFwOm5ldyByKDMyNzY4KSxkdHJlZTpbXSxpbWFwOm5ldyByKDUxMiksaXRyZWU6W10scmV2MTU6bmV3IHIoMzI3NjgpLGxoc3Q6bmV3IHQoMjg2KSxkaHN0Om5ldyB0KDMwKSxpaHN0Om5ldyB0KDE5KSxsaXRzOm5ldyB0KDE1ZTMpLHN0cnQ6bmV3IHIoNjU1MzYpLHByZXY6bmV3IHIoMzI3NjgpfSksZnVuY3Rpb24oKXtmb3IodmFyIGU9VVpJUC5GLlUscj0wO3I8MzI3Njg7cisrKXt2YXIgdD1yO3Q9KDQyNzgyNTUzNjAmKHQ9KDQwNDIzMjIxNjAmKHQ9KDM0MzU5NzM4MzYmKHQ9KDI4NjMzMTE1MzAmdCk+Pj4xfCgxNDMxNjU1NzY1JnQpPDwxKSk+Pj4yfCg4NTg5OTM0NTkmdCk8PDIpKT4+PjR8KDI1MjY0NTEzNSZ0KTw8NCkpPj4+OHwoMTY3MTE5MzUmdCk8PDgsZS5yZXYxNVtyXT0odD4+PjE2fHQ8PDE2KT4+PjE3fWZ1bmN0aW9uIHB1c2hWKGUscix0KXtmb3IoOzAhPXItLTspZS5wdXNoKDAsdCl9Zm9yKHI9MDtyPDMyO3IrKyllLmxkZWZbcl09ZS5vZjBbcl08PDN8ZS5leGJbcl0sZS5kZGVmW3JdPWUuZGYwW3JdPDw0fGUuZHhiW3JdO3B1c2hWKGUuZmx0cmVlLDE0NCw4KSxwdXNoVihlLmZsdHJlZSwxMTIsOSkscHVzaFYoZS5mbHRyZWUsMjQsNykscHVzaFYoZS5mbHRyZWUsOCw4KSxVWklQLkYubWFrZUNvZGVzKGUuZmx0cmVlLDkpLFVaSVAuRi5jb2RlczJtYXAoZS5mbHRyZWUsOSxlLmZsbWFwKSxVWklQLkYucmV2Q29kZXMoZS5mbHRyZWUsOSkscHVzaFYoZS5mZHRyZWUsMzIsNSksVVpJUC5GLm1ha2VDb2RlcyhlLmZkdHJlZSw1KSxVWklQLkYuY29kZXMybWFwKGUuZmR0cmVlLDUsZS5mZG1hcCksVVpJUC5GLnJldkNvZGVzKGUuZmR0cmVlLDUpLHB1c2hWKGUuaXRyZWUsMTksMCkscHVzaFYoZS5sdHJlZSwyODYsMCkscHVzaFYoZS5kdHJlZSwzMCwwKSxwdXNoVihlLnR0cmVlLDMyMCwwKX0oKX0pKSxVWklQPU9iamVjdC5mcmVlemUoX21lcmdlTmFtZXNwYWNlcyh7X19wcm90b19fOm51bGwsZGVmYXVsdDpVWklQXzF9LFtVWklQXzFdKSksVVBORz17fSxOLFcsSDtVUE5HLnRvUkdCQTg9ZnVuY3Rpb24oZSl7dmFyIHI9ZS53aWR0aCx0PWUuaGVpZ2h0O2lmKG51bGw9PWUudGFicy5hY1RMKXJldHVybltVUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UoZS5kYXRhLHIsdCxlKS5idWZmZXJdO3ZhciBhPVtdO251bGw9PWUuZnJhbWVzWzBdLmRhdGEmJihlLmZyYW1lc1swXS5kYXRhPWUuZGF0YSk7Zm9yKHZhciBpPXIqdCo0LHM9bmV3IFVpbnQ4QXJyYXkoaSksYz1uZXcgVWludDhBcnJheShpKSxsPW5ldyBVaW50OEFycmF5KGkpLHU9MDt1PGUuZnJhbWVzLmxlbmd0aDt1Kyspe3ZhciBwPWUuZnJhbWVzW3VdLGQ9cC5yZWN0LngsaD1wLnJlY3QueSx5PXAucmVjdC53aWR0aCxBPXAucmVjdC5oZWlnaHQsZz1VUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UocC5kYXRhLHksQSxlKTtpZigwIT11KWZvcih2YXIgdj0wO3Y8aTt2KyspbFt2XT1zW3ZdO2lmKDA9PXAuYmxlbmQ/VVBORy5fY29weVRpbGUoZyx5LEEscyxyLHQsZCxoLDApOjE9PXAuYmxlbmQmJlVQTkcuX2NvcHlUaWxlKGcseSxBLHMscix0LGQsaCwxKSxhLnB1c2gocy5idWZmZXIuc2xpY2UoMCkpLDA9PXAuZGlzcG9zZSk7ZWxzZSBpZigxPT1wLmRpc3Bvc2UpVVBORy5fY29weVRpbGUoYyx5LEEscyxyLHQsZCxoLDApO2Vsc2UgaWYoMj09cC5kaXNwb3NlKWZvcih2PTA7djxpO3YrKylzW3ZdPWxbdl19cmV0dXJuIGF9LFVQTkcudG9SR0JBOC5kZWNvZGVJbWFnZT1mdW5jdGlvbihlLHIsdCxhKXt2YXIgaT1yKnQscz1VUE5HLmRlY29kZS5fZ2V0QlBQKGEpLGM9TWF0aC5jZWlsKHIqcy84KSxsPW5ldyBVaW50OEFycmF5KDQqaSksdT1uZXcgVWludDMyQXJyYXkobC5idWZmZXIpLHA9YS5jdHlwZSxkPWEuZGVwdGgsaD1VUE5HLl9iaW4ucmVhZFVzaG9ydDtpZig2PT1wKXt2YXIgeT1pPDwyO2lmKDg9PWQpZm9yKHZhciBBPTA7QTx5O0ErPTQpbFtBXT1lW0FdLGxbQSsxXT1lW0ErMV0sbFtBKzJdPWVbQSsyXSxsW0ErM109ZVtBKzNdO2lmKDE2PT1kKWZvcihBPTA7QTx5O0ErKylsW0FdPWVbQTw8MV19ZWxzZSBpZigyPT1wKXt2YXIgZz1hLnRhYnMudFJOUztpZihudWxsPT1nKXtpZig4PT1kKWZvcihBPTA7QTxpO0ErKyl7dmFyIHY9MypBO3VbQV09MjU1PDwyNHxlW3YrMl08PDE2fGVbdisxXTw8OHxlW3ZdfWlmKDE2PT1kKWZvcihBPTA7QTxpO0ErKyl7dj02KkE7dVtBXT0yNTU8PDI0fGVbdis0XTw8MTZ8ZVt2KzJdPDw4fGVbdl19fWVsc2V7dmFyIEU9Z1swXSxtPWdbMV0sST1nWzJdO2lmKDg9PWQpZm9yKEE9MDtBPGk7QSsrKXt2YXIgUD1BPDwyO3Y9MypBO3VbQV09MjU1PDwyNHxlW3YrMl08PDE2fGVbdisxXTw8OHxlW3ZdLGVbdl09PUUmJmVbdisxXT09bSYmZVt2KzJdPT1JJiYobFtQKzNdPTApfWlmKDE2PT1kKWZvcihBPTA7QTxpO0ErKyl7UD1BPDwyLHY9NipBO3VbQV09MjU1PDwyNHxlW3YrNF08PDE2fGVbdisyXTw8OHxlW3ZdLGgoZSx2KT09RSYmaChlLHYrMik9PW0mJmgoZSx2KzQpPT1JJiYobFtQKzNdPTApfX19ZWxzZSBpZigzPT1wKXt2YXIgYj1hLnRhYnMuUExURSxUPWEudGFicy50Uk5TLFM9VD9ULmxlbmd0aDowO2lmKDE9PWQpZm9yKHZhciBSPTA7Ujx0O1IrKyl7dmFyIF89UipjLFU9UipyO2ZvcihBPTA7QTxyO0ErKyl7UD1VK0E8PDI7dmFyIHc9MyooTz1lW18rKEE+PjMpXT4+Ny0oKDcmQSk8PDApJjEpO2xbUF09Ylt3XSxsW1ArMV09Ylt3KzFdLGxbUCsyXT1iW3crMl0sbFtQKzNdPU88Uz9UW09dOjI1NX19aWYoMj09ZClmb3IoUj0wO1I8dDtSKyspZm9yKF89UipjLFU9UipyLEE9MDtBPHI7QSsrKXtQPVUrQTw8Mix3PTMqKE89ZVtfKyhBPj4yKV0+PjYtKCgzJkEpPDwxKSYzKTtsW1BdPWJbd10sbFtQKzFdPWJbdysxXSxsW1ArMl09Ylt3KzJdLGxbUCszXT1PPFM/VFtPXToyNTV9aWYoND09ZClmb3IoUj0wO1I8dDtSKyspZm9yKF89UipjLFU9UipyLEE9MDtBPHI7QSsrKXtQPVUrQTw8Mix3PTMqKE89ZVtfKyhBPj4xKV0+PjQtKCgxJkEpPDwyKSYxNSk7bFtQXT1iW3ddLGxbUCsxXT1iW3crMV0sbFtQKzJdPWJbdysyXSxsW1ArM109TzxTP1RbT106MjU1fWlmKDg9PWQpZm9yKEE9MDtBPGk7QSsrKXt2YXIgTztQPUE8PDIsdz0zKihPPWVbQV0pO2xbUF09Ylt3XSxsW1ArMV09Ylt3KzFdLGxbUCsyXT1iW3crMl0sbFtQKzNdPU88Uz9UW09dOjI1NX19ZWxzZSBpZig0PT1wKXtpZig4PT1kKWZvcihBPTA7QTxpO0ErKyl7UD1BPDwyO3ZhciBDPWVbJD1BPDwxXTtsW1BdPUMsbFtQKzFdPUMsbFtQKzJdPUMsbFtQKzNdPWVbJCsxXX1pZigxNj09ZClmb3IoQT0wO0E8aTtBKyspe3ZhciAkO1A9QTw8MixDPWVbJD1BPDwyXTtsW1BdPUMsbFtQKzFdPUMsbFtQKzJdPUMsbFtQKzNdPWVbJCsyXX19ZWxzZSBpZigwPT1wKWZvcihFPWEudGFicy50Uk5TP2EudGFicy50Uk5TOi0xLFI9MDtSPHQ7UisrKXt2YXIgTD1SKmMseD1SKnI7aWYoMT09ZClmb3IodmFyIE09MDtNPHI7TSsrKXt2YXIgQj0oQz0yNTUqKGVbTCsoTT4+PjMpXT4+PjctKDcmTSkmMSkpPT0yNTUqRT8wOjI1NTt1W3grTV09Qjw8MjR8Qzw8MTZ8Qzw8OHxDfWVsc2UgaWYoMj09ZClmb3IoTT0wO008cjtNKyspe0I9KEM9ODUqKGVbTCsoTT4+PjIpXT4+PjYtKCgzJk0pPDwxKSYzKSk9PTg1KkU/MDoyNTU7dVt4K01dPUI8PDI0fEM8PDE2fEM8PDh8Q31lbHNlIGlmKDQ9PWQpZm9yKE09MDtNPHI7TSsrKXtCPShDPTE3KihlW0wrKE0+Pj4xKV0+Pj40LSgoMSZNKTw8MikmMTUpKT09MTcqRT8wOjI1NTt1W3grTV09Qjw8MjR8Qzw8MTZ8Qzw8OHxDfWVsc2UgaWYoOD09ZClmb3IoTT0wO008cjtNKyspe0I9KEM9ZVtMK01dKT09RT8wOjI1NTt1W3grTV09Qjw8MjR8Qzw8MTZ8Qzw8OHxDfWVsc2UgaWYoMTY9PWQpZm9yKE09MDtNPHI7TSsrKXtDPWVbTCsoTTw8MSldLEI9aChlLEwrKE08PEEpKT09RT8wOjI1NTt1W3grTV09Qjw8MjR8Qzw8MTZ8Qzw8OHxDfX1yZXR1cm4gbH0sVVBORy5kZWNvZGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciByLHQ9bmV3IFVpbnQ4QXJyYXkoZSksYT04LGk9VVBORy5fYmluLHM9aS5yZWFkVXNob3J0LGM9aS5yZWFkVWludCxsPXt0YWJzOnt9LGZyYW1lczpbXX0sdT1uZXcgVWludDhBcnJheSh0Lmxlbmd0aCkscD0wLGQ9MCxoPVsxMzcsODAsNzgsNzEsMTMsMTAsMjYsMTBdLHk9MDt5PDg7eSsrKWlmKHRbeV0hPWhbeV0pdGhyb3dcIlRoZSBpbnB1dCBpcyBub3QgYSBQTkcgZmlsZSFcIjtmb3IoO2E8dC5sZW5ndGg7KXt2YXIgQT1pLnJlYWRVaW50KHQsYSk7YSs9NDt2YXIgZz1pLnJlYWRBU0NJSSh0LGEsNCk7aWYoYSs9NCxcIklIRFJcIj09ZylVUE5HLmRlY29kZS5fSUhEUih0LGEsbCk7ZWxzZSBpZihcIkNnQklcIj09ZylsLnRhYnNbZ109dC5zbGljZShhLGErNCk7ZWxzZSBpZihcIklEQVRcIj09Zyl7Zm9yKHk9MDt5PEE7eSsrKXVbcCt5XT10W2EreV07cCs9QX1lbHNlIGlmKFwiYWNUTFwiPT1nKWwudGFic1tnXT17bnVtX2ZyYW1lczpjKHQsYSksbnVtX3BsYXlzOmModCxhKzQpfSxyPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtlbHNlIGlmKFwiZmNUTFwiPT1nKXt2YXIgdjtpZigwIT1kKSh2PWwuZnJhbWVzW2wuZnJhbWVzLmxlbmd0aC0xXSkuZGF0YT1VUE5HLmRlY29kZS5fZGVjb21wcmVzcyhsLHIuc2xpY2UoMCxkKSx2LnJlY3Qud2lkdGgsdi5yZWN0LmhlaWdodCksZD0wO3ZhciBFPXt4OmModCxhKzEyKSx5OmModCxhKzE2KSx3aWR0aDpjKHQsYSs0KSxoZWlnaHQ6Yyh0LGErOCl9LG09cyh0LGErMjIpO209cyh0LGErMjApLygwPT1tPzEwMDptKTt2YXIgST17cmVjdDpFLGRlbGF5Ok1hdGgucm91bmQoMWUzKm0pLGRpc3Bvc2U6dFthKzI0XSxibGVuZDp0W2ErMjVdfTtsLmZyYW1lcy5wdXNoKEkpfWVsc2UgaWYoXCJmZEFUXCI9PWcpe2Zvcih5PTA7eTxBLTQ7eSsrKXJbZCt5XT10W2EreSs0XTtkKz1BLTR9ZWxzZSBpZihcInBIWXNcIj09ZylsLnRhYnNbZ109W2kucmVhZFVpbnQodCxhKSxpLnJlYWRVaW50KHQsYSs0KSx0W2ErOF1dO2Vsc2UgaWYoXCJjSFJNXCI9PWcpe2wudGFic1tnXT1bXTtmb3IoeT0wO3k8ODt5KyspbC50YWJzW2ddLnB1c2goaS5yZWFkVWludCh0LGErNCp5KSl9ZWxzZSBpZihcInRFWHRcIj09Z3x8XCJ6VFh0XCI9PWcpe251bGw9PWwudGFic1tnXSYmKGwudGFic1tnXT17fSk7dmFyIFA9aS5uZXh0WmVybyh0LGEpLGI9aS5yZWFkQVNDSUkodCxhLFAtYSksVD1hK0EtUC0xO2lmKFwidEVYdFwiPT1nKV89aS5yZWFkQVNDSUkodCxQKzEsVCk7ZWxzZXt2YXIgUz1VUE5HLmRlY29kZS5faW5mbGF0ZSh0LnNsaWNlKFArMixQKzIrVCkpO189aS5yZWFkVVRGOChTLDAsUy5sZW5ndGgpfWwudGFic1tnXVtiXT1ffWVsc2UgaWYoXCJpVFh0XCI9PWcpe251bGw9PWwudGFic1tnXSYmKGwudGFic1tnXT17fSk7UD0wO3ZhciBSPWE7UD1pLm5leHRaZXJvKHQsUik7Yj1pLnJlYWRBU0NJSSh0LFIsUC1SKTt2YXIgXyxVPXRbUj1QKzFdO3RbUisxXSxSKz0yLFA9aS5uZXh0WmVybyh0LFIpLGkucmVhZEFTQ0lJKHQsUixQLVIpLFI9UCsxLFA9aS5uZXh0WmVybyh0LFIpLGkucmVhZFVURjgodCxSLFAtUik7VD1BLSgoUj1QKzEpLWEpO2lmKDA9PVUpXz1pLnJlYWRVVEY4KHQsUixUKTtlbHNle1M9VVBORy5kZWNvZGUuX2luZmxhdGUodC5zbGljZShSLFIrVCkpO189aS5yZWFkVVRGOChTLDAsUy5sZW5ndGgpfWwudGFic1tnXVtiXT1ffWVsc2UgaWYoXCJQTFRFXCI9PWcpbC50YWJzW2ddPWkucmVhZEJ5dGVzKHQsYSxBKTtlbHNlIGlmKFwiaElTVFwiPT1nKXt2YXIgdz1sLnRhYnMuUExURS5sZW5ndGgvMztsLnRhYnNbZ109W107Zm9yKHk9MDt5PHc7eSsrKWwudGFic1tnXS5wdXNoKHModCxhKzIqeSkpfWVsc2UgaWYoXCJ0Uk5TXCI9PWcpMz09bC5jdHlwZT9sLnRhYnNbZ109aS5yZWFkQnl0ZXModCxhLEEpOjA9PWwuY3R5cGU/bC50YWJzW2ddPXModCxhKToyPT1sLmN0eXBlJiYobC50YWJzW2ddPVtzKHQsYSkscyh0LGErMikscyh0LGErNCldKTtlbHNlIGlmKFwiZ0FNQVwiPT1nKWwudGFic1tnXT1pLnJlYWRVaW50KHQsYSkvMWU1O2Vsc2UgaWYoXCJzUkdCXCI9PWcpbC50YWJzW2ddPXRbYV07ZWxzZSBpZihcImJLR0RcIj09ZykwPT1sLmN0eXBlfHw0PT1sLmN0eXBlP2wudGFic1tnXT1bcyh0LGEpXToyPT1sLmN0eXBlfHw2PT1sLmN0eXBlP2wudGFic1tnXT1bcyh0LGEpLHModCxhKzIpLHModCxhKzQpXTozPT1sLmN0eXBlJiYobC50YWJzW2ddPXRbYV0pO2Vsc2UgaWYoXCJJRU5EXCI9PWcpYnJlYWs7YSs9QSxpLnJlYWRVaW50KHQsYSksYSs9NH0wIT1kJiYoKHY9bC5mcmFtZXNbbC5mcmFtZXMubGVuZ3RoLTFdKS5kYXRhPVVQTkcuZGVjb2RlLl9kZWNvbXByZXNzKGwsci5zbGljZSgwLGQpLHYucmVjdC53aWR0aCx2LnJlY3QuaGVpZ2h0KSxkPTApO3JldHVybiBsLmRhdGE9VVBORy5kZWNvZGUuX2RlY29tcHJlc3MobCx1LGwud2lkdGgsbC5oZWlnaHQpLGRlbGV0ZSBsLmNvbXByZXNzLGRlbGV0ZSBsLmludGVybGFjZSxkZWxldGUgbC5maWx0ZXIsbH0sVVBORy5kZWNvZGUuX2RlY29tcHJlc3M9ZnVuY3Rpb24oZSxyLHQsYSl7dmFyIGk9VVBORy5kZWNvZGUuX2dldEJQUChlKSxzPU1hdGguY2VpbCh0KmkvOCksYz1uZXcgVWludDhBcnJheSgocysxK2UuaW50ZXJsYWNlKSphKTtyZXR1cm4gcj1lLnRhYnMuQ2dCST9VUE5HLmluZmxhdGVSYXcocixjKTpVUE5HLmRlY29kZS5faW5mbGF0ZShyLGMpLDA9PWUuaW50ZXJsYWNlP3I9VVBORy5kZWNvZGUuX2ZpbHRlclplcm8ocixlLDAsdCxhKToxPT1lLmludGVybGFjZSYmKHI9VVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UocixlKSkscn0sVVBORy5kZWNvZGUuX2luZmxhdGU9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gVVBORy5pbmZsYXRlUmF3KG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLDIsZS5sZW5ndGgtNikscil9LFVQTkcuaW5mbGF0ZVJhdz0oSD17fSxILkg9e30sSC5ILk49ZnVuY3Rpb24oZSxyKXt2YXIgdCxhLGk9VWludDhBcnJheSxzPTAsYz0wLGw9MCx1PTAscD0wLGQ9MCxoPTAseT0wLEE9MDtpZigzPT1lWzBdJiYwPT1lWzFdKXJldHVybiByfHxuZXcgaSgwKTt2YXIgZz1ILkgsdj1nLmIsRT1nLmUsbT1nLlIsST1nLm4sUD1nLkEsYj1nLlosVD1nLm0sUz1udWxsPT1yO2ZvcihTJiYocj1uZXcgaShlLmxlbmd0aD4+PjI8PDUpKTswPT1zOylpZihzPXYoZSxBLDEpLGM9dihlLEErMSwyKSxBKz0zLDAhPWMpe2lmKFMmJihyPUguSC5XKHIseSsoMTw8MTcpKSksMT09YyYmKHQ9VC5KLGE9VC5oLGQ9NTExLGg9MzEpLDI9PWMpe2w9RShlLEEsNSkrMjU3LHU9RShlLEErNSw1KSsxLHA9RShlLEErMTAsNCkrNCxBKz0xNDtmb3IodmFyIFI9MSxfPTA7XzwzODtfKz0yKVQuUVtfXT0wLFQuUVtfKzFdPTA7Zm9yKF89MDtfPHA7XysrKXt2YXIgVT1FKGUsQSszKl8sMyk7VC5RWzErKFQuWFtfXTw8MSldPVUsVT5SJiYoUj1VKX1BKz0zKnAsSShULlEsUiksUChULlEsUixULnUpLHQ9VC53LGE9VC5kLEE9bShULnUsKDE8PFIpLTEsbCt1LGUsQSxULnYpO3ZhciB3PWcuVihULnYsMCxsLFQuQyk7ZD0oMTw8dyktMTt2YXIgTz1nLlYoVC52LGwsdSxULkQpO2g9KDE8PE8pLTEsSShULkMsdyksUChULkMsdyx0KSxJKFQuRCxPKSxQKFQuRCxPLGEpfWZvcig7Oyl7dmFyIEM9dFtiKGUsQSkmZF07QSs9MTUmQzt2YXIgJD1DPj4+NDtpZigkPj4+OD09MClyW3krK109JDtlbHNle2lmKDI1Nj09JClicmVhazt2YXIgTD15KyQtMjU0O2lmKCQ+MjY0KXt2YXIgeD1ULnFbJC0yNTddO0w9eSsoeD4+PjMpK0UoZSxBLDcmeCksQSs9NyZ4fXZhciBNPWFbYihlLEEpJmhdO0ErPTE1Jk07dmFyIEI9TT4+PjQsRD1ULmNbQl0sRz0oRD4+PjQpK3YoZSxBLDE1JkQpO2ZvcihBKz0xNSZEO3k8TDspclt5XT1yW3krKy1HXSxyW3ldPXJbeSsrLUddLHJbeV09clt5KystR10sclt5XT1yW3krKy1HXTt5PUx9fX1lbHNlezAhPSg3JkEpJiYoQSs9OC0oNyZBKSk7dmFyIFY9NCsoQT4+PjMpLGs9ZVtWLTRdfGVbVi0zXTw8ODtTJiYocj1ILkguVyhyLHkraykpLHIuc2V0KG5ldyBpKGUuYnVmZmVyLGUuYnl0ZU9mZnNldCtWLGspLHkpLEE9VitrPDwzLHkrPWt9cmV0dXJuIHIubGVuZ3RoPT15P3I6ci5zbGljZSgwLHkpfSxILkguVz1mdW5jdGlvbihlLHIpe3ZhciB0PWUubGVuZ3RoO2lmKHI8PXQpcmV0dXJuIGU7dmFyIGE9bmV3IFVpbnQ4QXJyYXkodDw8MSk7cmV0dXJuIGEuc2V0KGUsMCksYX0sSC5ILlI9ZnVuY3Rpb24oZSxyLHQsYSxpLHMpe2Zvcih2YXIgYz1ILkguZSxsPUguSC5aLHU9MDt1PHQ7KXt2YXIgcD1lW2woYSxpKSZyXTtpKz0xNSZwO3ZhciBkPXA+Pj40O2lmKGQ8PTE1KXNbdV09ZCx1Kys7ZWxzZXt2YXIgaD0wLHk9MDsxNj09ZD8oeT0zK2MoYSxpLDIpLGkrPTIsaD1zW3UtMV0pOjE3PT1kPyh5PTMrYyhhLGksMyksaSs9Myk6MTg9PWQmJih5PTExK2MoYSxpLDcpLGkrPTcpO2Zvcih2YXIgQT11K3k7dTxBOylzW3VdPWgsdSsrfX1yZXR1cm4gaX0sSC5ILlY9ZnVuY3Rpb24oZSxyLHQsYSl7Zm9yKHZhciBpPTAscz0wLGM9YS5sZW5ndGg+Pj4xO3M8dDspe3ZhciBsPWVbcytyXTthW3M8PDFdPTAsYVsxKyhzPDwxKV09bCxsPmkmJihpPWwpLHMrK31mb3IoO3M8YzspYVtzPDwxXT0wLGFbMSsoczw8MSldPTAscysrO3JldHVybiBpfSxILkgubj1mdW5jdGlvbihlLHIpe2Zvcih2YXIgdCxhLGkscyxjPUguSC5tLGw9ZS5sZW5ndGgsdT1jLmoscD0wO3A8PXI7cCsrKXVbcF09MDtmb3IocD0xO3A8bDtwKz0yKXVbZVtwXV0rKzt2YXIgZD1jLks7Zm9yKHQ9MCx1WzBdPTAsYT0xO2E8PXI7YSsrKXQ9dCt1W2EtMV08PDEsZFthXT10O2ZvcihpPTA7aTxsO2krPTIpMCE9KHM9ZVtpKzFdKSYmKGVbaV09ZFtzXSxkW3NdKyspfSxILkguQT1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhPWUubGVuZ3RoLGk9SC5ILm0ucixzPTA7czxhO3MrPTIpaWYoMCE9ZVtzKzFdKWZvcih2YXIgYz1zPj4xLGw9ZVtzKzFdLHU9Yzw8NHxsLHA9ci1sLGQ9ZVtzXTw8cCxoPWQrKDE8PHApO2QhPWg7KXRbaVtkXT4+PjE1LXJdPXUsZCsrfSxILkgubD1mdW5jdGlvbihlLHIpe2Zvcih2YXIgdD1ILkgubS5yLGE9MTUtcixpPTA7aTxlLmxlbmd0aDtpKz0yKXt2YXIgcz1lW2ldPDxyLWVbaSsxXTtlW2ldPXRbc10+Pj5hfX0sSC5ILk09ZnVuY3Rpb24oZSxyLHQpe3Q8PD03JnI7dmFyIGE9cj4+PjM7ZVthXXw9dCxlW2ErMV18PXQ+Pj44fSxILkguST1mdW5jdGlvbihlLHIsdCl7dDw8PTcmcjt2YXIgYT1yPj4+MztlW2FdfD10LGVbYSsxXXw9dD4+PjgsZVthKzJdfD10Pj4+MTZ9LEguSC5lPWZ1bmN0aW9uKGUscix0KXtyZXR1cm4oZVtyPj4+M118ZVsxKyhyPj4+MyldPDw4KT4+Pig3JnIpJigxPDx0KS0xfSxILkguYj1mdW5jdGlvbihlLHIsdCl7cmV0dXJuKGVbcj4+PjNdfGVbMSsocj4+PjMpXTw8OHxlWzIrKHI+Pj4zKV08PDE2KT4+Pig3JnIpJigxPDx0KS0xfSxILkguWj1mdW5jdGlvbihlLHIpe3JldHVybihlW3I+Pj4zXXxlWzErKHI+Pj4zKV08PDh8ZVsyKyhyPj4+MyldPDwxNik+Pj4oNyZyKX0sSC5ILmk9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZVtyPj4+M118ZVsxKyhyPj4+MyldPDw4fGVbMisocj4+PjMpXTw8MTZ8ZVszKyhyPj4+MyldPDwyNCk+Pj4oNyZyKX0sSC5ILm09KE49VWludDE2QXJyYXksVz1VaW50MzJBcnJheSx7SzpuZXcgTigxNiksajpuZXcgTigxNiksWDpbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sUzpbMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCw5OTksOTk5LDk5OV0sVDpbMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDAsMCwwXSxxOm5ldyBOKDMyKSxwOlsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsNjU1MzUsNjU1MzVdLHo6WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSxjOm5ldyBXKDMyKSxKOm5ldyBOKDUxMiksXzpbXSxoOm5ldyBOKDMyKSwkOltdLHc6bmV3IE4oMzI3NjgpLEM6W10sdjpbXSxkOm5ldyBOKDMyNzY4KSxEOltdLHU6bmV3IE4oNTEyKSxROltdLHI6bmV3IE4oMzI3NjgpLHM6bmV3IFcoMjg2KSxZOm5ldyBXKDMwKSxhOm5ldyBXKDE5KSx0Om5ldyBXKDE1ZTMpLGs6bmV3IE4oNjU1MzYpLGc6bmV3IE4oMzI3NjgpfSksZnVuY3Rpb24oKXtmb3IodmFyIGU9SC5ILm0scj0wO3I8MzI3Njg7cisrKXt2YXIgdD1yO3Q9KDQyNzgyNTUzNjAmKHQ9KDQwNDIzMjIxNjAmKHQ9KDM0MzU5NzM4MzYmKHQ9KDI4NjMzMTE1MzAmdCk+Pj4xfCgxNDMxNjU1NzY1JnQpPDwxKSk+Pj4yfCg4NTg5OTM0NTkmdCk8PDIpKT4+PjR8KDI1MjY0NTEzNSZ0KTw8NCkpPj4+OHwoMTY3MTE5MzUmdCk8PDgsZS5yW3JdPSh0Pj4+MTZ8dDw8MTYpPj4+MTd9ZnVuY3Rpb24gbihlLHIsdCl7Zm9yKDswIT1yLS07KWUucHVzaCgwLHQpfWZvcihyPTA7cjwzMjtyKyspZS5xW3JdPWUuU1tyXTw8M3xlLlRbcl0sZS5jW3JdPWUucFtyXTw8NHxlLnpbcl07bihlLl8sMTQ0LDgpLG4oZS5fLDExMiw5KSxuKGUuXywyNCw3KSxuKGUuXyw4LDgpLEguSC5uKGUuXyw5KSxILkguQShlLl8sOSxlLkopLEguSC5sKGUuXyw5KSxuKGUuJCwzMiw1KSxILkgubihlLiQsNSksSC5ILkEoZS4kLDUsZS5oKSxILkgubChlLiQsNSksbihlLlEsMTksMCksbihlLkMsMjg2LDApLG4oZS5ELDMwLDApLG4oZS52LDMyMCwwKX0oKSxILkguTiksVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2U9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIHQ9ci53aWR0aCxhPXIuaGVpZ2h0LGk9VVBORy5kZWNvZGUuX2dldEJQUChyKSxzPWk+PjMsYz1NYXRoLmNlaWwodCppLzgpLGw9bmV3IFVpbnQ4QXJyYXkoYSpjKSx1PTAscD1bMCwwLDQsMCwyLDAsMV0sZD1bMCw0LDAsMiwwLDEsMF0saD1bOCw4LDgsNCw0LDIsMl0seT1bOCw4LDQsNCwyLDIsMV0sQT0wO0E8Nzspe2Zvcih2YXIgZz1oW0FdLHY9eVtBXSxFPTAsbT0wLEk9cFtBXTtJPGE7KUkrPWcsbSsrO2Zvcih2YXIgUD1kW0FdO1A8dDspUCs9dixFKys7dmFyIGI9TWF0aC5jZWlsKEUqaS84KTtVUE5HLmRlY29kZS5fZmlsdGVyWmVybyhlLHIsdSxFLG0pO2Zvcih2YXIgVD0wLFM9cFtBXTtTPGE7KXtmb3IodmFyIFI9ZFtBXSxfPXUrVCpiPDwzO1I8dDspe3ZhciBVO2lmKDE9PWkpVT0oVT1lW18+PjNdKT4+Ny0oNyZfKSYxLGxbUypjKyhSPj4zKV18PVU8PDctKCg3JlIpPDwwKTtpZigyPT1pKVU9KFU9ZVtfPj4zXSk+PjYtKDcmXykmMyxsW1MqYysoUj4+MildfD1VPDw2LSgoMyZSKTw8MSk7aWYoND09aSlVPShVPWVbXz4+M10pPj40LSg3Jl8pJjE1LGxbUypjKyhSPj4xKV18PVU8PDQtKCgxJlIpPDwyKTtpZihpPj04KWZvcih2YXIgdz1TKmMrUipzLE89MDtPPHM7TysrKWxbdytPXT1lWyhfPj4zKStPXTtfKz1pLFIrPXZ9VCsrLFMrPWd9RSptIT0wJiYodSs9bSooMStiKSksQSs9MX1yZXR1cm4gbH0sVVBORy5kZWNvZGUuX2dldEJQUD1mdW5jdGlvbihlKXtyZXR1cm5bMSxudWxsLDMsMSwyLG51bGwsNF1bZS5jdHlwZV0qZS5kZXB0aH0sVVBORy5kZWNvZGUuX2ZpbHRlclplcm89ZnVuY3Rpb24oZSxyLHQsYSxpKXt2YXIgcz1VUE5HLmRlY29kZS5fZ2V0QlBQKHIpLGM9TWF0aC5jZWlsKGEqcy84KSxsPVVQTkcuZGVjb2RlLl9wYWV0aDtzPU1hdGguY2VpbChzLzgpO3ZhciB1PTAscD0xLGQ9ZVt0XSxoPTA7aWYoZD4xJiYoZVt0XT1bMCwwLDFdW2QtMl0pLDM9PWQpZm9yKGg9cztoPGM7aCsrKWVbaCsxXT1lW2grMV0rKGVbaCsxLXNdPj4+MSkmMjU1O2Zvcih2YXIgeT0wO3k8aTt5KyspaWYoaD0wLDA9PShkPWVbKHA9KHU9dCt5KmMpK3krMSktMV0pKWZvcig7aDxjO2grKyllW3UraF09ZVtwK2hdO2Vsc2UgaWYoMT09ZCl7Zm9yKDtoPHM7aCsrKWVbdStoXT1lW3AraF07Zm9yKDtoPGM7aCsrKWVbdStoXT1lW3AraF0rZVt1K2gtc119ZWxzZSBpZigyPT1kKWZvcig7aDxjO2grKyllW3UraF09ZVtwK2hdK2VbdStoLWNdO2Vsc2UgaWYoMz09ZCl7Zm9yKDtoPHM7aCsrKWVbdStoXT1lW3AraF0rKGVbdStoLWNdPj4+MSk7Zm9yKDtoPGM7aCsrKWVbdStoXT1lW3AraF0rKGVbdStoLWNdK2VbdStoLXNdPj4+MSl9ZWxzZXtmb3IoO2g8cztoKyspZVt1K2hdPWVbcCtoXStsKDAsZVt1K2gtY10sMCk7Zm9yKDtoPGM7aCsrKWVbdStoXT1lW3AraF0rbChlW3UraC1zXSxlW3UraC1jXSxlW3UraC1zLWNdKX1yZXR1cm4gZX0sVVBORy5kZWNvZGUuX3BhZXRoPWZ1bmN0aW9uKGUscix0KXt2YXIgYT1lK3ItdCxpPWEtZSxzPWEtcixjPWEtdDtyZXR1cm4gaSppPD1zKnMmJmkqaTw9YypjP2U6cypzPD1jKmM/cjp0fSxVUE5HLmRlY29kZS5fSUhEUj1mdW5jdGlvbihlLHIsdCl7dmFyIGE9VVBORy5fYmluO3Qud2lkdGg9YS5yZWFkVWludChlLHIpLHIrPTQsdC5oZWlnaHQ9YS5yZWFkVWludChlLHIpLHIrPTQsdC5kZXB0aD1lW3JdLHIrKyx0LmN0eXBlPWVbcl0scisrLHQuY29tcHJlc3M9ZVtyXSxyKyssdC5maWx0ZXI9ZVtyXSxyKyssdC5pbnRlcmxhY2U9ZVtyXSxyKyt9LFVQTkcuX2Jpbj17bmV4dFplcm86ZnVuY3Rpb24gbmV4dFplcm8oZSxyKXtmb3IoOzAhPWVbcl07KXIrKztyZXR1cm4gcn0scmVhZFVzaG9ydDpmdW5jdGlvbiByZWFkVXNob3J0KGUscil7cmV0dXJuIGVbcl08PDh8ZVtyKzFdfSx3cml0ZVVzaG9ydDpmdW5jdGlvbiB3cml0ZVVzaG9ydChlLHIsdCl7ZVtyXT10Pj44JjI1NSxlW3IrMV09MjU1JnR9LHJlYWRVaW50OmZ1bmN0aW9uIHJlYWRVaW50KGUscil7cmV0dXJuIDE2Nzc3MjE2KmVbcl0rKGVbcisxXTw8MTZ8ZVtyKzJdPDw4fGVbciszXSl9LHdyaXRlVWludDpmdW5jdGlvbiB3cml0ZVVpbnQoZSxyLHQpe2Vbcl09dD4+MjQmMjU1LGVbcisxXT10Pj4xNiYyNTUsZVtyKzJdPXQ+PjgmMjU1LGVbciszXT0yNTUmdH0scmVhZEFTQ0lJOmZ1bmN0aW9uIHJlYWRBU0NJSShlLHIsdCl7Zm9yKHZhciBhPVwiXCIsaT0wO2k8dDtpKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZShlW3IraV0pO3JldHVybiBhfSx3cml0ZUFTQ0lJOmZ1bmN0aW9uIHdyaXRlQVNDSUkoZSxyLHQpe2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKWVbcithXT10LmNoYXJDb2RlQXQoYSl9LHJlYWRCeXRlczpmdW5jdGlvbiByZWFkQnl0ZXMoZSxyLHQpe2Zvcih2YXIgYT1bXSxpPTA7aTx0O2krKylhLnB1c2goZVtyK2ldKTtyZXR1cm4gYX0scGFkOmZ1bmN0aW9uIHBhZChlKXtyZXR1cm4gZS5sZW5ndGg8Mj9cIjBcIi5jb25jYXQoZSk6ZX0scmVhZFVURjg6ZnVuY3Rpb24gcmVhZFVURjgoZSxyLHQpe2Zvcih2YXIgYSxpPVwiXCIscz0wO3M8dDtzKyspaSs9XCIlXCIuY29uY2F0KFVQTkcuX2Jpbi5wYWQoZVtyK3NdLnRvU3RyaW5nKDE2KSkpO3RyeXthPWRlY29kZVVSSUNvbXBvbmVudChpKX1jYXRjaChhKXtyZXR1cm4gVVBORy5fYmluLnJlYWRBU0NJSShlLHIsdCl9cmV0dXJuIGF9fSxVUE5HLl9jb3B5VGlsZT1mdW5jdGlvbihlLHIsdCxhLGkscyxjLGwsdSl7Zm9yKHZhciBwPU1hdGgubWluKHIsaSksZD1NYXRoLm1pbih0LHMpLGg9MCx5PTAsQT0wO0E8ZDtBKyspZm9yKHZhciBnPTA7ZzxwO2crKylpZihjPj0wJiZsPj0wPyhoPUEqcitnPDwyLHk9KGwrQSkqaStjK2c8PDIpOihoPSgtbCtBKSpyLWMrZzw8Mix5PUEqaStnPDwyKSwwPT11KWFbeV09ZVtoXSxhW3krMV09ZVtoKzFdLGFbeSsyXT1lW2grMl0sYVt5KzNdPWVbaCszXTtlbHNlIGlmKDE9PXUpe3ZhciB2PWVbaCszXSooMS8yNTUpLEU9ZVtoXSp2LG09ZVtoKzFdKnYsST1lW2grMl0qdixQPWFbeSszXSooMS8yNTUpLGI9YVt5XSpQLFQ9YVt5KzFdKlAsUz1hW3krMl0qUCxSPTEtdixfPXYrUCpSLFU9MD09Xz8wOjEvXzthW3krM109MjU1Kl8sYVt5KzBdPShFK2IqUikqVSxhW3krMV09KG0rVCpSKSpVLGFbeSsyXT0oSStTKlIpKlV9ZWxzZSBpZigyPT11KXt2PWVbaCszXSxFPWVbaF0sbT1lW2grMV0sST1lW2grMl0sUD1hW3krM10sYj1hW3ldLFQ9YVt5KzFdLFM9YVt5KzJdO3Y9PVAmJkU9PWImJm09PVQmJkk9PVM/KGFbeV09MCxhW3krMV09MCxhW3krMl09MCxhW3krM109MCk6KGFbeV09RSxhW3krMV09bSxhW3krMl09SSxhW3krM109dil9ZWxzZSBpZigzPT11KXt2PWVbaCszXSxFPWVbaF0sbT1lW2grMV0sST1lW2grMl0sUD1hW3krM10sYj1hW3ldLFQ9YVt5KzFdLFM9YVt5KzJdO2lmKHY9PVAmJkU9PWImJm09PVQmJkk9PVMpY29udGludWU7aWYodjwyMjAmJlA+MjApcmV0dXJuITF9cmV0dXJuITB9LFVQTkcuZW5jb2RlPWZ1bmN0aW9uKGUscix0LGEsaSxzLGMpe251bGw9PWEmJihhPTApLG51bGw9PWMmJihjPSExKTt2YXIgbD1VUE5HLmVuY29kZS5jb21wcmVzcyhlLHIsdCxhLFshMSwhMSwhMSwwLGNdKTtyZXR1cm4gVVBORy5lbmNvZGUuY29tcHJlc3NQTkcobCwtMSksVVBORy5lbmNvZGUuX21haW4obCxyLHQsaSxzKX0sVVBORy5lbmNvZGVMTD1mdW5jdGlvbihlLHIsdCxhLGkscyxjLGwpe2Zvcih2YXIgdT17Y3R5cGU6MCsoMT09YT8wOjIpKygwPT1pPzA6NCksZGVwdGg6cyxmcmFtZXM6W119LHA9KGEraSkqcyxkPXAqcixoPTA7aDxlLmxlbmd0aDtoKyspdS5mcmFtZXMucHVzaCh7cmVjdDp7eDowLHk6MCx3aWR0aDpyLGhlaWdodDp0fSxpbWc6bmV3IFVpbnQ4QXJyYXkoZVtoXSksYmxlbmQ6MCxkaXNwb3NlOjEsYnBwOk1hdGguY2VpbChwLzgpLGJwbDpNYXRoLmNlaWwoZC84KX0pO3JldHVybiBVUE5HLmVuY29kZS5jb21wcmVzc1BORyh1LDAsITApLFVQTkcuZW5jb2RlLl9tYWluKHUscix0LGMsbCl9LFVQTkcuZW5jb2RlLl9tYWluPWZ1bmN0aW9uKGUscix0LGEsaSl7bnVsbD09aSYmKGk9e30pO3ZhciBzPVVQTkcuY3JjLmNyYyxjPVVQTkcuX2Jpbi53cml0ZVVpbnQsbD1VUE5HLl9iaW4ud3JpdGVVc2hvcnQsdT1VUE5HLl9iaW4ud3JpdGVBU0NJSSxwPTgsZD1lLmZyYW1lcy5sZW5ndGg+MSxoPSExLHk9MzMrKGQ/MjA6MCk7aWYobnVsbCE9aS5zUkdCJiYoeSs9MTMpLG51bGwhPWkucEhZcyYmKHkrPTIxKSwzPT1lLmN0eXBlKXtmb3IodmFyIEE9ZS5wbHRlLmxlbmd0aCxnPTA7ZzxBO2crKyllLnBsdGVbZ10+Pj4yNCE9MjU1JiYoaD0hMCk7eSs9OCszKkErNCsoaD84KzEqQSs0OjApfWZvcih2YXIgdj0wO3Y8ZS5mcmFtZXMubGVuZ3RoO3YrKyl7ZCYmKHkrPTM4KSx5Kz0oXz1lLmZyYW1lc1t2XSkuY2ltZy5sZW5ndGgrMTIsMCE9diYmKHkrPTQpfXkrPTEyO3ZhciBFPW5ldyBVaW50OEFycmF5KHkpLG09WzEzNyw4MCw3OCw3MSwxMywxMCwyNiwxMF07Zm9yKGc9MDtnPDg7ZysrKUVbZ109bVtnXTtpZihjKEUscCwxMyksdShFLHArPTQsXCJJSERSXCIpLGMoRSxwKz00LHIpLGMoRSxwKz00LHQpLEVbcCs9NF09ZS5kZXB0aCxFWysrcF09ZS5jdHlwZSxFWysrcF09MCxFWysrcF09MCxFWysrcF09MCxjKEUsKytwLHMoRSxwLTE3LDE3KSkscCs9NCxudWxsIT1pLnNSR0ImJihjKEUscCwxKSx1KEUscCs9NCxcInNSR0JcIiksRVtwKz00XT1pLnNSR0IsYyhFLCsrcCxzKEUscC01LDUpKSxwKz00KSxudWxsIT1pLnBIWXMmJihjKEUscCw5KSx1KEUscCs9NCxcInBIWXNcIiksYyhFLHArPTQsaS5wSFlzWzBdKSxjKEUscCs9NCxpLnBIWXNbMV0pLEVbcCs9NF09aS5wSFlzWzJdLGMoRSwrK3AscyhFLHAtMTMsMTMpKSxwKz00KSxkJiYoYyhFLHAsOCksdShFLHArPTQsXCJhY1RMXCIpLGMoRSxwKz00LGUuZnJhbWVzLmxlbmd0aCksYyhFLHArPTQsbnVsbCE9aS5sb29wP2kubG9vcDowKSxjKEUscCs9NCxzKEUscC0xMiwxMikpLHArPTQpLDM9PWUuY3R5cGUpe2MoRSxwLDMqKEE9ZS5wbHRlLmxlbmd0aCkpLHUoRSxwKz00LFwiUExURVwiKSxwKz00O2ZvcihnPTA7ZzxBO2crKyl7dmFyIEk9MypnLFA9ZS5wbHRlW2ddLGI9MjU1JlAsVD1QPj4+OCYyNTUsUz1QPj4+MTYmMjU1O0VbcCtJKzBdPWIsRVtwK0krMV09VCxFW3ArSSsyXT1TfWlmKGMoRSxwKz0zKkEscyhFLHAtMypBLTQsMypBKzQpKSxwKz00LGgpe2MoRSxwLEEpLHUoRSxwKz00LFwidFJOU1wiKSxwKz00O2ZvcihnPTA7ZzxBO2crKylFW3ArZ109ZS5wbHRlW2ddPj4+MjQmMjU1O2MoRSxwKz1BLHMoRSxwLUEtNCxBKzQpKSxwKz00fX12YXIgUj0wO2Zvcih2PTA7djxlLmZyYW1lcy5sZW5ndGg7disrKXt2YXIgXz1lLmZyYW1lc1t2XTtkJiYoYyhFLHAsMjYpLHUoRSxwKz00LFwiZmNUTFwiKSxjKEUscCs9NCxSKyspLGMoRSxwKz00LF8ucmVjdC53aWR0aCksYyhFLHArPTQsXy5yZWN0LmhlaWdodCksYyhFLHArPTQsXy5yZWN0LngpLGMoRSxwKz00LF8ucmVjdC55KSxsKEUscCs9NCxhW3ZdKSxsKEUscCs9MiwxZTMpLEVbcCs9Ml09Xy5kaXNwb3NlLEVbKytwXT1fLmJsZW5kLGMoRSwrK3AscyhFLHAtMzAsMzApKSxwKz00KTt2YXIgVT1fLmNpbWc7YyhFLHAsKEE9VS5sZW5ndGgpKygwPT12PzA6NCkpO3ZhciB3PXArPTQ7dShFLHAsMD09dj9cIklEQVRcIjpcImZkQVRcIikscCs9NCwwIT12JiYoYyhFLHAsUisrKSxwKz00KSxFLnNldChVLHApLGMoRSxwKz1BLHMoRSx3LHAtdykpLHArPTR9cmV0dXJuIGMoRSxwLDApLHUoRSxwKz00LFwiSUVORFwiKSxjKEUscCs9NCxzKEUscC00LDQpKSxwKz00LEUuYnVmZmVyfSxVUE5HLmVuY29kZS5jb21wcmVzc1BORz1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBhPTA7YTxlLmZyYW1lcy5sZW5ndGg7YSsrKXt2YXIgaT1lLmZyYW1lc1thXTtpLnJlY3Qud2lkdGg7dmFyIHM9aS5yZWN0LmhlaWdodCxjPW5ldyBVaW50OEFycmF5KHMqaS5icGwrcyk7aS5jaW1nPVVQTkcuZW5jb2RlLl9maWx0ZXJaZXJvKGkuaW1nLHMsaS5icHAsaS5icGwsYyxyLHQpfX0sVVBORy5lbmNvZGUuY29tcHJlc3M9ZnVuY3Rpb24oZSxyLHQsYSxpKXtmb3IodmFyIHM9aVswXSxjPWlbMV0sbD1pWzJdLHU9aVszXSxwPWlbNF0sZD02LGg9OCx5PTI1NSxBPTA7QTxlLmxlbmd0aDtBKyspZm9yKHZhciBnPW5ldyBVaW50OEFycmF5KGVbQV0pLHY9Zy5sZW5ndGgsRT0wO0U8djtFKz00KXkmPWdbRSszXTt2YXIgbT0yNTUhPXksST1VUE5HLmVuY29kZS5mcmFtaXplKGUscix0LHMsYyxsKSxQPXt9LGI9W10sVD1bXTtpZigwIT1hKXt2YXIgUz1bXTtmb3IoRT0wO0U8SS5sZW5ndGg7RSsrKVMucHVzaChJW0VdLmltZy5idWZmZXIpO3ZhciBSPVVQTkcuZW5jb2RlLmNvbmNhdFJHQkEoUyksXz1VUE5HLnF1YW50aXplKFIsYSksVT0wLHc9bmV3IFVpbnQ4QXJyYXkoXy5hYnVmKTtmb3IoRT0wO0U8SS5sZW5ndGg7RSsrKXt2YXIgTz0oSj1JW0VdLmltZykubGVuZ3RoO1QucHVzaChuZXcgVWludDhBcnJheShfLmluZHMuYnVmZmVyLFU+PjIsTz4+MikpO2ZvcihBPTA7QTxPO0ErPTQpSltBXT13W1UrQV0sSltBKzFdPXdbVStBKzFdLEpbQSsyXT13W1UrQSsyXSxKW0ErM109d1tVK0ErM107VSs9T31mb3IoRT0wO0U8Xy5wbHRlLmxlbmd0aDtFKyspYi5wdXNoKF8ucGx0ZVtFXS5lc3QucmdiYSl9ZWxzZSBmb3IoQT0wO0E8SS5sZW5ndGg7QSsrKXt2YXIgQz1JW0FdLCQ9bmV3IFVpbnQzMkFycmF5KEMuaW1nLmJ1ZmZlciksTD1DLnJlY3Qud2lkdGgseD0odj0kLmxlbmd0aCxuZXcgVWludDhBcnJheSh2KSk7VC5wdXNoKHgpO2ZvcihFPTA7RTx2O0UrKyl7dmFyIE09JFtFXTtpZigwIT1FJiZNPT0kW0UtMV0peFtFXT14W0UtMV07ZWxzZSBpZihFPkwmJk09PSRbRS1MXSl4W0VdPXhbRS1MXTtlbHNle3ZhciBCPVBbTV07aWYobnVsbD09QiYmKFBbTV09Qj1iLmxlbmd0aCxiLnB1c2goTSksYi5sZW5ndGg+PTMwMCkpYnJlYWs7eFtFXT1CfX19dmFyIEQ9Yi5sZW5ndGg7RDw9MjU2JiYwPT1wJiYoaD1EPD0yPzE6RDw9ND8yOkQ8PTE2PzQ6OCxoPU1hdGgubWF4KGgsdSkpO2ZvcihBPTA7QTxJLmxlbmd0aDtBKyspeyhDPUlbQV0pLnJlY3QueCxDLnJlY3QueTtMPUMucmVjdC53aWR0aDt2YXIgRz1DLnJlY3QuaGVpZ2h0LFY9Qy5pbWc7bmV3IFVpbnQzMkFycmF5KFYuYnVmZmVyKTt2YXIgaz00KkwsWT00O2lmKEQ8PTI1NiYmMD09cCl7az1NYXRoLmNlaWwoaCpMLzgpO2Zvcih2YXIgcT1uZXcgVWludDhBcnJheShrKkcpLFo9VFtBXSxRPTA7UTxHO1ErKyl7RT1RKms7dmFyIHo9USpMO2lmKDg9PWgpZm9yKHZhciBLPTA7SzxMO0srKylxW0UrS109Wlt6K0tdO2Vsc2UgaWYoND09aClmb3IoSz0wO0s8TDtLKyspcVtFKyhLPj4xKV18PVpbeitLXTw8NC00KigxJkspO2Vsc2UgaWYoMj09aClmb3IoSz0wO0s8TDtLKyspcVtFKyhLPj4yKV18PVpbeitLXTw8Ni0yKigzJkspO2Vsc2UgaWYoMT09aClmb3IoSz0wO0s8TDtLKyspcVtFKyhLPj4zKV18PVpbeitLXTw8Ny0xKig3JkspfVY9cSxkPTMsWT0xfWVsc2UgaWYoMD09bSYmMT09SS5sZW5ndGgpe3E9bmV3IFVpbnQ4QXJyYXkoTCpHKjMpO3ZhciBYPUwqRztmb3IoRT0wO0U8WDtFKyspe3ZhciBKLGVlPTQqRTtxW0o9MypFXT1WW2VlXSxxW0orMV09VltlZSsxXSxxW0orMl09VltlZSsyXX1WPXEsZD0yLFk9MyxrPTMqTH1DLmltZz1WLEMuYnBsPWssQy5icHA9WX1yZXR1cm57Y3R5cGU6ZCxkZXB0aDpoLHBsdGU6YixmcmFtZXM6SX19LFVQTkcuZW5jb2RlLmZyYW1pemU9ZnVuY3Rpb24oZSxyLHQsYSxpLHMpe2Zvcih2YXIgYz1bXSxsPTA7bDxlLmxlbmd0aDtsKyspe3ZhciB1LHA9bmV3IFVpbnQ4QXJyYXkoZVtsXSksZD1uZXcgVWludDMyQXJyYXkocC5idWZmZXIpLGg9MCx5PTAsQT1yLGc9dCx2PWE/MTowO2lmKDAhPWwpe2Zvcih2YXIgRT1zfHxhfHwxPT1sfHwwIT1jW2wtMl0uZGlzcG9zZT8xOjIsbT0wLEk9MWU5LFA9MDtQPEU7UCsrKXtmb3IodmFyIGI9bmV3IFVpbnQ4QXJyYXkoZVtsLTEtUF0pLFQ9bmV3IFVpbnQzMkFycmF5KGVbbC0xLVBdKSxTPXIsUj10LF89LTEsVT0tMSx3PTA7dzx0O3crKylmb3IodmFyIE89MDtPPHI7TysrKXtkW0Q9dypyK09dIT1UW0RdJiYoTzxTJiYoUz1PKSxPPl8mJihfPU8pLHc8UiYmKFI9dyksdz5VJiYoVT13KSl9LTE9PV8mJihTPVI9Xz1VPTApLGkmJigxPT0oMSZTKSYmUy0tLDE9PSgxJlIpJiZSLS0pO3ZhciBDPShfLVMrMSkqKFUtUisxKTtDPEkmJihJPUMsbT1QLGg9Uyx5PVIsQT1fLVMrMSxnPVUtUisxKX1iPW5ldyBVaW50OEFycmF5KGVbbC0xLW1dKTsxPT1tJiYoY1tsLTFdLmRpc3Bvc2U9MiksdT1uZXcgVWludDhBcnJheShBKmcqNCksVVBORy5fY29weVRpbGUoYixyLHQsdSxBLGcsLWgsLXksMCksMT09KHY9VVBORy5fY29weVRpbGUocCxyLHQsdSxBLGcsLWgsLXksMyk/MTowKT9VUE5HLmVuY29kZS5fcHJlcGFyZURpZmYocCxyLHQsdSx7eDpoLHk6eSx3aWR0aDpBLGhlaWdodDpnfSk6VVBORy5fY29weVRpbGUocCxyLHQsdSxBLGcsLWgsLXksMCl9ZWxzZSB1PXAuc2xpY2UoMCk7Yy5wdXNoKHtyZWN0Ont4OmgseTp5LHdpZHRoOkEsaGVpZ2h0Omd9LGltZzp1LGJsZW5kOnYsZGlzcG9zZTowfSl9aWYoYSlmb3IobD0wO2w8Yy5sZW5ndGg7bCsrKXtpZigxIT0oRz1jW2xdKS5ibGVuZCl7dmFyICQ9Ry5yZWN0LEw9Y1tsLTFdLnJlY3QseD1NYXRoLm1pbigkLngsTC54KSxNPU1hdGgubWluKCQueSxMLnkpLEI9e3g6eCx5Ok0sd2lkdGg6TWF0aC5tYXgoJC54KyQud2lkdGgsTC54K0wud2lkdGgpLXgsaGVpZ2h0Ok1hdGgubWF4KCQueSskLmhlaWdodCxMLnkrTC5oZWlnaHQpLU19O2NbbC0xXS5kaXNwb3NlPTEsbC0xIT0wJiZVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoZSxyLHQsYyxsLTEsQixpKSxVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUoZSxyLHQsYyxsLEIsaSl9fWlmKDEhPWUubGVuZ3RoKWZvcih2YXIgRD0wO0Q8Yy5sZW5ndGg7RCsrKXt2YXIgRzsoRz1jW0RdKS5yZWN0LndpZHRoKkcucmVjdC5oZWlnaHR9cmV0dXJuIGN9LFVQTkcuZW5jb2RlLl91cGRhdGVGcmFtZT1mdW5jdGlvbihlLHIsdCxhLGkscyxjKXtmb3IodmFyIGw9VWludDhBcnJheSx1PVVpbnQzMkFycmF5LHA9bmV3IGwoZVtpLTFdKSxkPW5ldyB1KGVbaS0xXSksaD1pKzE8ZS5sZW5ndGg/bmV3IGwoZVtpKzFdKTpudWxsLHk9bmV3IGwoZVtpXSksQT1uZXcgdSh5LmJ1ZmZlciksZz1yLHY9dCxFPS0xLG09LTEsST0wO0k8cy5oZWlnaHQ7SSsrKWZvcih2YXIgUD0wO1A8cy53aWR0aDtQKyspe3ZhciBiPXMueCtQLFQ9cy55K0ksUz1UKnIrYixSPUFbU107MD09Unx8MD09YVtpLTFdLmRpc3Bvc2UmJmRbU109PVImJihudWxsPT1ofHwwIT1oWzQqUyszXSl8fChiPGcmJihnPWIpLGI+RSYmKEU9YiksVDx2JiYodj1UKSxUPm0mJihtPVQpKX0tMT09RSYmKGc9dj1FPW09MCksYyYmKDE9PSgxJmcpJiZnLS0sMT09KDEmdikmJnYtLSkscz17eDpnLHk6dix3aWR0aDpFLWcrMSxoZWlnaHQ6bS12KzF9O3ZhciBfPWFbaV07Xy5yZWN0PXMsXy5ibGVuZD0xLF8uaW1nPW5ldyBVaW50OEFycmF5KHMud2lkdGgqcy5oZWlnaHQqNCksMD09YVtpLTFdLmRpc3Bvc2U/KFVQTkcuX2NvcHlUaWxlKHAscix0LF8uaW1nLHMud2lkdGgscy5oZWlnaHQsLXMueCwtcy55LDApLFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZih5LHIsdCxfLmltZyxzKSk6VVBORy5fY29weVRpbGUoeSxyLHQsXy5pbWcscy53aWR0aCxzLmhlaWdodCwtcy54LC1zLnksMCl9LFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZj1mdW5jdGlvbihlLHIsdCxhLGkpe1VQTkcuX2NvcHlUaWxlKGUscix0LGEsaS53aWR0aCxpLmhlaWdodCwtaS54LC1pLnksMil9LFVQTkcuZW5jb2RlLl9maWx0ZXJaZXJvPWZ1bmN0aW9uKGUscix0LGEsaSxzLGMpe3ZhciBsLHU9W10scD1bMCwxLDIsMyw0XTstMSE9cz9wPVtzXToociphPjVlNXx8MT09dCkmJihwPVswXSksYyYmKGw9e2xldmVsOjB9KTtmb3IodmFyIGQsaD1VWklQLHk9MDt5PHAubGVuZ3RoO3krKyl7Zm9yKHZhciBBPTA7QTxyO0ErKylVUE5HLmVuY29kZS5fZmlsdGVyTGluZShpLGUsQSxhLHQscFt5XSk7dS5wdXNoKGguZGVmbGF0ZShpLGwpKX12YXIgZz0xZTk7Zm9yKHk9MDt5PHUubGVuZ3RoO3krKyl1W3ldLmxlbmd0aDxnJiYoZD15LGc9dVt5XS5sZW5ndGgpO3JldHVybiB1W2RdfSxVUE5HLmVuY29kZS5fZmlsdGVyTGluZT1mdW5jdGlvbihlLHIsdCxhLGkscyl7dmFyIGM9dCphLGw9Yyt0LHU9VVBORy5kZWNvZGUuX3BhZXRoO2lmKGVbbF09cyxsKyssMD09cylpZihhPDUwMClmb3IodmFyIHA9MDtwPGE7cCsrKWVbbCtwXT1yW2MrcF07ZWxzZSBlLnNldChuZXcgVWludDhBcnJheShyLmJ1ZmZlcixjLGEpLGwpO2Vsc2UgaWYoMT09cyl7Zm9yKHA9MDtwPGk7cCsrKWVbbCtwXT1yW2MrcF07Zm9yKHA9aTtwPGE7cCsrKWVbbCtwXT1yW2MrcF0tcltjK3AtaV0rMjU2JjI1NX1lbHNlIGlmKDA9PXQpe2ZvcihwPTA7cDxpO3ArKyllW2wrcF09cltjK3BdO2lmKDI9PXMpZm9yKHA9aTtwPGE7cCsrKWVbbCtwXT1yW2MrcF07aWYoMz09cylmb3IocD1pO3A8YTtwKyspZVtsK3BdPXJbYytwXS0ocltjK3AtaV0+PjEpKzI1NiYyNTU7aWYoND09cylmb3IocD1pO3A8YTtwKyspZVtsK3BdPXJbYytwXS11KHJbYytwLWldLDAsMCkrMjU2JjI1NX1lbHNle2lmKDI9PXMpZm9yKHA9MDtwPGE7cCsrKWVbbCtwXT1yW2MrcF0rMjU2LXJbYytwLWFdJjI1NTtpZigzPT1zKXtmb3IocD0wO3A8aTtwKyspZVtsK3BdPXJbYytwXSsyNTYtKHJbYytwLWFdPj4xKSYyNTU7Zm9yKHA9aTtwPGE7cCsrKWVbbCtwXT1yW2MrcF0rMjU2LShyW2MrcC1hXStyW2MrcC1pXT4+MSkmMjU1fWlmKDQ9PXMpe2ZvcihwPTA7cDxpO3ArKyllW2wrcF09cltjK3BdKzI1Ni11KDAscltjK3AtYV0sMCkmMjU1O2ZvcihwPWk7cDxhO3ArKyllW2wrcF09cltjK3BdKzI1Ni11KHJbYytwLWldLHJbYytwLWFdLHJbYytwLWktYV0pJjI1NX19fSxVUE5HLmNyYz17dGFibGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IFVpbnQzMkFycmF5KDI1Nikscj0wO3I8MjU2O3IrKyl7Zm9yKHZhciB0PXIsYT0wO2E8ODthKyspMSZ0P3Q9Mzk4ODI5MjM4NF50Pj4+MTp0Pj4+PTE7ZVtyXT10fXJldHVybiBlfSgpLHVwZGF0ZTpmdW5jdGlvbiB1cGRhdGUoZSxyLHQsYSl7Zm9yKHZhciBpPTA7aTxhO2krKyllPVVQTkcuY3JjLnRhYmxlWzI1NSYoZV5yW3QraV0pXV5lPj4+ODtyZXR1cm4gZX0sY3JjOmZ1bmN0aW9uIGNyYyhlLHIsdCl7cmV0dXJuIDQyOTQ5NjcyOTVeVVBORy5jcmMudXBkYXRlKDQyOTQ5NjcyOTUsZSxyLHQpfX0sVVBORy5xdWFudGl6ZT1mdW5jdGlvbihlLHIpe3ZhciB0LGE9bmV3IFVpbnQ4QXJyYXkoZSksaT1hLnNsaWNlKDApLHM9bmV3IFVpbnQzMkFycmF5KGkuYnVmZmVyKSxjPVVQTkcucXVhbnRpemUuZ2V0S0R0cmVlKGksciksbD1jWzBdLHU9Y1sxXSxwPVVQTkcucXVhbnRpemUucGxhbmVEc3QsZD1hLGg9cyx5PWQubGVuZ3RoLEE9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGg+PjIpO2lmKGEubGVuZ3RoPDJlNylmb3IodmFyIGc9MDtnPHk7Zys9NCl7dmFyIHY9ZFtnXSooMS8yNTUpLEU9ZFtnKzFdKigxLzI1NSksbT1kW2crMl0qKDEvMjU1KSxJPWRbZyszXSooMS8yNTUpO3Q9VVBORy5xdWFudGl6ZS5nZXROZWFyZXN0KGwsdixFLG0sSSksQVtnPj4yXT10LmluZCxoW2c+PjJdPXQuZXN0LnJnYmF9ZWxzZSBmb3IoZz0wO2c8eTtnKz00KXt2PWRbZ10qKDEvMjU1KSxFPWRbZysxXSooMS8yNTUpLG09ZFtnKzJdKigxLzI1NSksST1kW2crM10qKDEvMjU1KTtmb3IodD1sO3QubGVmdDspdD1wKHQuZXN0LHYsRSxtLEkpPD0wP3QubGVmdDp0LnJpZ2h0O0FbZz4+Ml09dC5pbmQsaFtnPj4yXT10LmVzdC5yZ2JhfXJldHVybnthYnVmOmkuYnVmZmVyLGluZHM6QSxwbHRlOnV9fSxVUE5HLnF1YW50aXplLmdldEtEdHJlZT1mdW5jdGlvbihlLHIsdCl7bnVsbD09dCYmKHQ9MWUtNCk7dmFyIGE9bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyKSxpPXtpMDowLGkxOmUubGVuZ3RoLGJzdDpudWxsLGVzdDpudWxsLHRkc3Q6MCxsZWZ0Om51bGwscmlnaHQ6bnVsbH07aS5ic3Q9VVBORy5xdWFudGl6ZS5zdGF0cyhlLGkuaTAsaS5pMSksaS5lc3Q9VVBORy5xdWFudGl6ZS5lc3RhdHMoaS5ic3QpO2Zvcih2YXIgcz1baV07cy5sZW5ndGg8cjspe2Zvcih2YXIgYz0wLGw9MCx1PTA7dTxzLmxlbmd0aDt1Kyspc1t1XS5lc3QuTD5jJiYoYz1zW3VdLmVzdC5MLGw9dSk7aWYoYzx0KWJyZWFrO3ZhciBwPXNbbF0sZD1VUE5HLnF1YW50aXplLnNwbGl0UGl4ZWxzKGUsYSxwLmkwLHAuaTEscC5lc3QuZSxwLmVzdC5lTXEyNTUpO2lmKHAuaTA+PWR8fHAuaTE8PWQpcC5lc3QuTD0wO2Vsc2V7dmFyIGg9e2kwOnAuaTAsaTE6ZCxic3Q6bnVsbCxlc3Q6bnVsbCx0ZHN0OjAsbGVmdDpudWxsLHJpZ2h0Om51bGx9O2guYnN0PVVQTkcucXVhbnRpemUuc3RhdHMoZSxoLmkwLGguaTEpLGguZXN0PVVQTkcucXVhbnRpemUuZXN0YXRzKGguYnN0KTt2YXIgeT17aTA6ZCxpMTpwLmkxLGJzdDpudWxsLGVzdDpudWxsLHRkc3Q6MCxsZWZ0Om51bGwscmlnaHQ6bnVsbH07eS5ic3Q9e1I6W10sbTpbXSxOOnAuYnN0Lk4taC5ic3QuTn07Zm9yKHU9MDt1PDE2O3UrKyl5LmJzdC5SW3VdPXAuYnN0LlJbdV0taC5ic3QuUlt1XTtmb3IodT0wO3U8NDt1KyspeS5ic3QubVt1XT1wLmJzdC5tW3VdLWguYnN0Lm1bdV07eS5lc3Q9VVBORy5xdWFudGl6ZS5lc3RhdHMoeS5ic3QpLHAubGVmdD1oLHAucmlnaHQ9eSxzW2xdPWgscy5wdXNoKHkpfX1zLnNvcnQoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHIuYnN0Lk4tZS5ic3QuTn0pKTtmb3IodT0wO3U8cy5sZW5ndGg7dSsrKXNbdV0uaW5kPXU7cmV0dXJuW2ksc119LFVQTkcucXVhbnRpemUuZ2V0TmVhcmVzdD1mdW5jdGlvbihlLHIsdCxhLGkpe2lmKG51bGw9PWUubGVmdClyZXR1cm4gZS50ZHN0PVVQTkcucXVhbnRpemUuZGlzdChlLmVzdC5xLHIsdCxhLGkpLGU7dmFyIHM9VVBORy5xdWFudGl6ZS5wbGFuZURzdChlLmVzdCxyLHQsYSxpKSxjPWUubGVmdCxsPWUucmlnaHQ7cz4wJiYoYz1lLnJpZ2h0LGw9ZS5sZWZ0KTt2YXIgdT1VUE5HLnF1YW50aXplLmdldE5lYXJlc3QoYyxyLHQsYSxpKTtpZih1LnRkc3Q8PXMqcylyZXR1cm4gdTt2YXIgcD1VUE5HLnF1YW50aXplLmdldE5lYXJlc3QobCxyLHQsYSxpKTtyZXR1cm4gcC50ZHN0PHUudGRzdD9wOnV9LFVQTkcucXVhbnRpemUucGxhbmVEc3Q9ZnVuY3Rpb24oZSxyLHQsYSxpKXt2YXIgcz1lLmU7cmV0dXJuIHNbMF0qcitzWzFdKnQrc1syXSphK3NbM10qaS1lLmVNcX0sVVBORy5xdWFudGl6ZS5kaXN0PWZ1bmN0aW9uKGUscix0LGEsaSl7dmFyIHM9ci1lWzBdLGM9dC1lWzFdLGw9YS1lWzJdLHU9aS1lWzNdO3JldHVybiBzKnMrYypjK2wqbCt1KnV9LFVQTkcucXVhbnRpemUuc3BsaXRQaXhlbHM9ZnVuY3Rpb24oZSxyLHQsYSxpLHMpe3ZhciBjPVVQTkcucXVhbnRpemUudmVjRG90O2ZvcihhLT00O3Q8YTspe2Zvcig7YyhlLHQsaSk8PXM7KXQrPTQ7Zm9yKDtjKGUsYSxpKT5zOylhLT00O2lmKHQ+PWEpYnJlYWs7dmFyIGw9clt0Pj4yXTtyW3Q+PjJdPXJbYT4+Ml0sclthPj4yXT1sLHQrPTQsYS09NH1mb3IoO2MoZSx0LGkpPnM7KXQtPTQ7cmV0dXJuIHQrNH0sVVBORy5xdWFudGl6ZS52ZWNEb3Q9ZnVuY3Rpb24oZSxyLHQpe3JldHVybiBlW3JdKnRbMF0rZVtyKzFdKnRbMV0rZVtyKzJdKnRbMl0rZVtyKzNdKnRbM119LFVQTkcucXVhbnRpemUuc3RhdHM9ZnVuY3Rpb24oZSxyLHQpe2Zvcih2YXIgYT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0saT1bMCwwLDAsMF0scz10LXI+PjIsYz1yO2M8dDtjKz00KXt2YXIgbD1lW2NdKigxLzI1NSksdT1lW2MrMV0qKDEvMjU1KSxwPWVbYysyXSooMS8yNTUpLGQ9ZVtjKzNdKigxLzI1NSk7aVswXSs9bCxpWzFdKz11LGlbMl0rPXAsaVszXSs9ZCxhWzBdKz1sKmwsYVsxXSs9bCp1LGFbMl0rPWwqcCxhWzNdKz1sKmQsYVs1XSs9dSp1LGFbNl0rPXUqcCxhWzddKz11KmQsYVsxMF0rPXAqcCxhWzExXSs9cCpkLGFbMTVdKz1kKmR9cmV0dXJuIGFbNF09YVsxXSxhWzhdPWFbMl0sYVs5XT1hWzZdLGFbMTJdPWFbM10sYVsxM109YVs3XSxhWzE0XT1hWzExXSx7UjphLG06aSxOOnN9fSxVUE5HLnF1YW50aXplLmVzdGF0cz1mdW5jdGlvbihlKXt2YXIgcj1lLlIsdD1lLm0sYT1lLk4saT10WzBdLHM9dFsxXSxjPXRbMl0sbD10WzNdLHU9MD09YT8wOjEvYSxwPVtyWzBdLWkqaSp1LHJbMV0taSpzKnUsclsyXS1pKmMqdSxyWzNdLWkqbCp1LHJbNF0tcyppKnUscls1XS1zKnMqdSxyWzZdLXMqYyp1LHJbN10tcypsKnUscls4XS1jKmkqdSxyWzldLWMqcyp1LHJbMTBdLWMqYyp1LHJbMTFdLWMqbCp1LHJbMTJdLWwqaSp1LHJbMTNdLWwqcyp1LHJbMTRdLWwqYyp1LHJbMTVdLWwqbCp1XSxkPXAsaD1VUE5HLk00LHk9W01hdGgucmFuZG9tKCksTWF0aC5yYW5kb20oKSxNYXRoLnJhbmRvbSgpLE1hdGgucmFuZG9tKCldLEE9MCxnPTA7aWYoMCE9YSlmb3IodmFyIHY9MDt2PDE2JiYoeT1oLm11bHRWZWMoZCx5KSxnPU1hdGguc3FydChoLmRvdCh5LHkpKSx5PWguc21sKDEvZyx5KSwhKDAhPXYmJk1hdGguYWJzKGctQSk8MWUtOSkpO3YrKylBPWc7dmFyIEU9W2kqdSxzKnUsYyp1LGwqdV07cmV0dXJue0NvdjpwLHE6RSxlOnksTDpBLGVNcTI1NTpoLmRvdChoLnNtbCgyNTUsRSkseSksZU1xOmguZG90KHksRSkscmdiYTooTWF0aC5yb3VuZCgyNTUqRVszXSk8PDI0fE1hdGgucm91bmQoMjU1KkVbMl0pPDwxNnxNYXRoLnJvdW5kKDI1NSpFWzFdKTw8OHxNYXRoLnJvdW5kKDI1NSpFWzBdKTw8MCk+Pj4wfX0sVVBORy5NND17bXVsdFZlYzpmdW5jdGlvbiBtdWx0VmVjKGUscil7cmV0dXJuW2VbMF0qclswXStlWzFdKnJbMV0rZVsyXSpyWzJdK2VbM10qclszXSxlWzRdKnJbMF0rZVs1XSpyWzFdK2VbNl0qclsyXStlWzddKnJbM10sZVs4XSpyWzBdK2VbOV0qclsxXStlWzEwXSpyWzJdK2VbMTFdKnJbM10sZVsxMl0qclswXStlWzEzXSpyWzFdK2VbMTRdKnJbMl0rZVsxNV0qclszXV19LGRvdDpmdW5jdGlvbiBkb3QoZSxyKXtyZXR1cm4gZVswXSpyWzBdK2VbMV0qclsxXStlWzJdKnJbMl0rZVszXSpyWzNdfSxzbWw6ZnVuY3Rpb24gc21sKGUscil7cmV0dXJuW2UqclswXSxlKnJbMV0sZSpyWzJdLGUqclszXV19fSxVUE5HLmVuY29kZS5jb25jYXRSR0JBPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoO3QrKylyKz1lW3RdLmJ5dGVMZW5ndGg7dmFyIGE9bmV3IFVpbnQ4QXJyYXkociksaT0wO2Zvcih0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcih2YXIgcz1uZXcgVWludDhBcnJheShlW3RdKSxjPXMubGVuZ3RoLGw9MDtsPGM7bCs9NCl7dmFyIHU9c1tsXSxwPXNbbCsxXSxkPXNbbCsyXSxoPXNbbCszXTswPT1oJiYodT1wPWQ9MCksYVtpK2xdPXUsYVtpK2wrMV09cCxhW2krbCsyXT1kLGFbaStsKzNdPWh9aSs9Y31yZXR1cm4gYS5idWZmZXJ9O3ZhciBNYXhDYW52YXNTaXplPXtjaHJvbWU6MTYzODQsZmlyZWZveDoxMTE4MCxcImRlc2t0b3Agc2FmYXJpXCI6MTYzODQsXCJpbnRlcm5ldCBleHBsb3JlclwiOjgxOTIsXCJtb2JpbGUgc2FmYXJpXCI6NDA5NixldGM6ODE5Mn0saXNCcm93c2VyPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3csbW9kdWxlTWFwcGVyPWlzQnJvd3NlciYmd2luZG93LmNvcmRvdmEmJndpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUmJndpbmRvdy5jb3Jkb3ZhLnJlcXVpcmUoXCJjb3Jkb3ZhL21vZHVsZW1hcHBlclwiKSxDdXN0b21GaWxlPWlzQnJvd3NlciYmKG1vZHVsZU1hcHBlciYmbW9kdWxlTWFwcGVyLmdldE9yaWdpbmFsU3ltYm9sKHdpbmRvdyxcIkZpbGVcIil8fHZvaWQgMCE9PXdpbmRvdy5GaWxlJiZGaWxlKSxDdXN0b21GaWxlUmVhZGVyPWlzQnJvd3NlciYmKG1vZHVsZU1hcHBlciYmbW9kdWxlTWFwcGVyLmdldE9yaWdpbmFsU3ltYm9sKHdpbmRvdyxcIkZpbGVSZWFkZXJcIil8fHZvaWQgMCE9PXdpbmRvdy5GaWxlUmVhZGVyJiZGaWxlUmVhZGVyKTtmdW5jdGlvbiBnZXRGaWxlZnJvbURhdGFVcmwoZSxyKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06RGF0ZS5ub3coKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGEpe2Zvcih2YXIgaT1lLnNwbGl0KFwiLFwiKSxzPWlbMF0ubWF0Y2goLzooLio/KTsvKVsxXSxjPWdsb2JhbFRoaXMuYXRvYihpWzFdKSxsPWMubGVuZ3RoLHU9bmV3IFVpbnQ4QXJyYXkobCk7bC0tOyl1W2xdPWMuY2hhckNvZGVBdChsKTt2YXIgcD1uZXcgQmxvYihbdV0se3R5cGU6c30pO3AubmFtZT1yLHAubGFzdE1vZGlmaWVkPXQsYShwKX0pKX1mdW5jdGlvbiBnZXREYXRhVXJsRnJvbUZpbGUoZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLHQpe3ZhciBhPW5ldyBDdXN0b21GaWxlUmVhZGVyO2Eub25sb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIHIoYS5yZXN1bHQpfSxhLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9LGEucmVhZEFzRGF0YVVSTChlKX0pKX1mdW5jdGlvbiBsb2FkSW1hZ2UoZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLHQpe3ZhciBhPW5ldyBJbWFnZTthLm9ubG9hZD1mdW5jdGlvbigpe3JldHVybiByKGEpfSxhLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9LGEuc3JjPWV9KSl9ZnVuY3Rpb24gZ2V0QnJvd3Nlck5hbWUoKXt2YXIgZT1cImV0Y1wiLHI9bmF2aWdhdG9yLnVzZXJBZ2VudDtyZXR1cm4vQ2hyb20oZXxpdW0pL2kudGVzdChyKT9lPVwiY2hyb21lXCI6L2lQKGFkfG9kfGhvbmUpL2kudGVzdChyKSYmL1dlYktpdC9pLnRlc3QocikmJiEvKENyaU9TfEZ4aU9TfE9QaU9TfG1lcmN1cnkpL2kudGVzdChyKT9lPVwibW9iaWxlIHNhZmFyaVwiOi9TYWZhcmkvaS50ZXN0KHIpP2U9XCJkZXNrdG9wIHNhZmFyaVwiOi9GaXJlZm94L2kudGVzdChyKT9lPVwiZmlyZWZveFwiOigvTVNJRS9pLnRlc3Qocil8fCEwPT0hIWRvY3VtZW50LmRvY3VtZW50TW9kZSkmJihlPVwiaW50ZXJuZXQgZXhwbG9yZXJcIiksZX1mdW5jdGlvbiBhcHByb3hpbWF0ZUJlbG93TWF4aW11bUNhbnZhc1NpemVPZkJyb3dzZXIoZSxyKXtmb3IodmFyIHQ9Z2V0QnJvd3Nlck5hbWUoKSxhPU1heENhbnZhc1NpemVbdF0saT1lLHM9cixjPWkqcyxsPWk+cz9zL2k6aS9zO2M+YSphOyl7dmFyIHU9KGEraSkvMixwPShhK3MpLzI7dTxwPyhzPXAsaT1wKmwpOihzPXUqbCxpPXUpLGM9aSpzfXJldHVybnt3aWR0aDppLGhlaWdodDpzfX1mdW5jdGlvbiBnZXROZXdDYW52YXNBbmRDdHgoZSxyKXt2YXIgdCxhO3RyeXtpZihudWxsPT09KGE9KHQ9bmV3IE9mZnNjcmVlbkNhbnZhcyhlLHIpKS5nZXRDb250ZXh0KFwiMmRcIikpKXRocm93IG5ldyBFcnJvcihcImdldENvbnRleHQgb2YgT2Zmc2NyZWVuQ2FudmFzIHJldHVybnMgbnVsbFwiKX1jYXRjaChlKXthPSh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLmdldENvbnRleHQoXCIyZFwiKX1yZXR1cm4gdC53aWR0aD1lLHQuaGVpZ2h0PXIsW3QsYV19ZnVuY3Rpb24gZHJhd0ltYWdlSW5DYW52YXMoZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnZvaWQgMCx0PWFwcHJveGltYXRlQmVsb3dNYXhpbXVtQ2FudmFzU2l6ZU9mQnJvd3NlcihlLndpZHRoLGUuaGVpZ2h0KSxhPXQud2lkdGgsaT10LmhlaWdodCxzPWdldE5ld0NhbnZhc0FuZEN0eChhLGkpLGM9X3NsaWNlZFRvQXJyYXkocywyKSxsPWNbMF0sdT1jWzFdO3JldHVybiByJiYvanBlP2cvLnRlc3QocikmJih1LmZpbGxTdHlsZT1cIndoaXRlXCIsdS5maWxsUmVjdCgwLDAsbC53aWR0aCxsLmhlaWdodCkpLHUuZHJhd0ltYWdlKGUsMCwwLGwud2lkdGgsbC5oZWlnaHQpLGx9ZnVuY3Rpb24gaXNJT1MoKXtyZXR1cm4gdm9pZCAwIT09aXNJT1MuY2FjaGVkUmVzdWx0fHwoaXNJT1MuY2FjaGVkUmVzdWx0PVtcImlQYWQgU2ltdWxhdG9yXCIsXCJpUGhvbmUgU2ltdWxhdG9yXCIsXCJpUG9kIFNpbXVsYXRvclwiLFwiaVBhZFwiLFwiaVBob25lXCIsXCJpUG9kXCJdLmluY2x1ZGVzKG5hdmlnYXRvci5wbGF0Zm9ybSl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoXCJNYWNcIikmJlwib250b3VjaGVuZFwiaW4gZG9jdW1lbnQpLGlzSU9TLmNhY2hlZFJlc3VsdH1mdW5jdGlvbiBkcmF3RmlsZUluQ2FudmFzKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocix0KXt2YXIgYSxpLHM9ZnVuY3Rpb24gJFRyeV8yX1Bvc3QoKXt0cnl7cmV0dXJuIGk9ZHJhd0ltYWdlSW5DYW52YXMoYSxlLnR5cGUpLHIoW2EsaV0pfWNhdGNoKGUpe3JldHVybiB0KGUpfX0sYz1mdW5jdGlvbiAkVHJ5XzJfQ2F0Y2gocil7dHJ5ezA7dmFyIGk9ZnVuY3Rpb24gJFRyeV8zX0NhdGNoKGUpe3RyeXt0aHJvdyBlfWNhdGNoKGUpe3JldHVybiB0KGUpfX07dHJ5e3JldHVybiBnZXREYXRhVXJsRnJvbUZpbGUoZSkudGhlbigoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBsb2FkSW1hZ2UoZSkudGhlbigoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBhPWUsZnVuY3Rpb24gJFRyeV8zX1Bvc3QoKXt0cnl7cmV0dXJuIHMoKX1jYXRjaChlKXtyZXR1cm4gdChlKX19KCl9Y2F0Y2goZSl7cmV0dXJuIGkoZSl9fSksaSl9Y2F0Y2goZSl7cmV0dXJuIGkoZSl9fSksaSl9Y2F0Y2goZSl7aShlKX19Y2F0Y2goZSl7cmV0dXJuIHQoZSl9fTt0cnl7aWYoaXNJT1MoKSl0aHJvdyBuZXcgRXJyb3IoXCJTa2lwIGNyZWF0ZUltYWdlQml0bWFwIG9uIElPUyBkZXZpY2VcIik7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gYT1lLHMoKX1jYXRjaChlKXtyZXR1cm4gYygpfX0pLGMpfWNhdGNoKGUpe2MoKX19KSl9ZnVuY3Rpb24gY2FudmFzVG9GaWxlKGUscix0LGEpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XToxO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocyxjKXt2YXIgbCx1LHA7aWYoXCJpbWFnZS9wbmdcIj09PXIpcmV0dXJuIHU9ZS5nZXRDb250ZXh0KFwiMmRcIikuZ2V0SW1hZ2VEYXRhKDAsMCxlLndpZHRoLGUuaGVpZ2h0KS5kYXRhLHA9VVBORy5lbmNvZGUoW3VdLGUud2lkdGgsZS5oZWlnaHQsMjU2KmkpLChsPW5ldyBCbG9iKFtwXSx7dHlwZTpyfSkpLm5hbWU9dCxsLmxhc3RNb2RpZmllZD1hLCRJZl80LmNhbGwodGhpcyk7e3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyYmZSBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcz9lLmNvbnZlcnRUb0Jsb2Ioe3R5cGU6cixxdWFsaXR5Oml9KS50aGVuKGZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4obD1lKS5uYW1lPXQsbC5sYXN0TW9kaWZpZWQ9YSwkSWZfNS5jYWxsKHRoaXMpfWNhdGNoKGUpe3JldHVybiBjKGUpfX0uYmluZCh0aGlzKSxjKTpnZXRGaWxlZnJvbURhdGFVcmwoZS50b0RhdGFVUkwocixpKSx0LGEpLnRoZW4oZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBsPWUsJElmXzUuY2FsbCh0aGlzKX1jYXRjaChlKXtyZXR1cm4gYyhlKX19LmJpbmQodGhpcyksYyk7ZnVuY3Rpb24gJElmXzUoKXtyZXR1cm4gJElmXzQuY2FsbCh0aGlzKX19ZnVuY3Rpb24gJElmXzQoKXtyZXR1cm4gcyhsKX19KSl9ZnVuY3Rpb24gY2xlYW51cENhbnZhc01lbW9yeShlKXtlLndpZHRoPTAsZS5oZWlnaHQ9MH1mdW5jdGlvbiBpc0F1dG9PcmllbnRhdGlvbkluQnJvd3Nlcigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXt2YXIgdCxhLGkscztyZXR1cm4gdm9pZCAwIT09aXNBdXRvT3JpZW50YXRpb25JbkJyb3dzZXIucmVzdWx0P2UoaXNBdXRvT3JpZW50YXRpb25JbkJyb3dzZXIucmVzdWx0KTooXCJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80UUFpUlhocFpnQUFUVTBBS2dBQUFBZ0FBUUVTQUFNQUFBQUJBQVlBQUFBQUFBRC8yd0NFQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFmL0FBQkVJQUFFQUFnTUJFUUFDRVFFREVRSC94QUJLQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFMRUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBRVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlvQURBTUJBQUlSQXhFQVB3QS84SC8vMlE9PVwiLGdldEZpbGVmcm9tRGF0YVVybChcImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzRRQWlSWGhwWmdBQVRVMEFLZ0FBQUFnQUFRRVNBQU1BQUFBQkFBWUFBQUFBQUFELzJ3Q0VBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQWYvQUFCRUlBQUVBQWdNQkVRQUNFUUVERVFIL3hBQktBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUxFQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFFUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUEvOW9BREFNQkFBSVJBeEVBUHdBLzhILy8yUT09XCIsXCJ0ZXN0LmpwZ1wiLERhdGUubm93KCkpLnRoZW4oKGZ1bmN0aW9uKGMpe3RyeXtyZXR1cm4gZHJhd0ZpbGVJbkNhbnZhcyh0PWMpLnRoZW4oKGZ1bmN0aW9uKGMpe3RyeXtyZXR1cm4gY2FudmFzVG9GaWxlKGE9Y1sxXSx0LnR5cGUsdC5uYW1lLHQubGFzdE1vZGlmaWVkKS50aGVuKChmdW5jdGlvbih0KXt0cnl7cmV0dXJuIGk9dCxjbGVhbnVwQ2FudmFzTWVtb3J5KGEpLGRyYXdGaWxlSW5DYW52YXMoaSkudGhlbigoZnVuY3Rpb24odCl7dHJ5e3JldHVybiBzPXRbMF0saXNBdXRvT3JpZW50YXRpb25JbkJyb3dzZXIucmVzdWx0PTE9PT1zLndpZHRoJiYyPT09cy5oZWlnaHQsZShpc0F1dG9PcmllbnRhdGlvbkluQnJvd3Nlci5yZXN1bHQpfWNhdGNoKGUpe3JldHVybiByKGUpfX0pLHIpfWNhdGNoKGUpe3JldHVybiByKGUpfX0pLHIpfWNhdGNoKGUpe3JldHVybiByKGUpfX0pLHIpfWNhdGNoKGUpe3JldHVybiByKGUpfX0pLHIpKX0pKX1mdW5jdGlvbiBnZXRFeGlmT3JpZW50YXRpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLHQpe3ZhciBhPW5ldyBDdXN0b21GaWxlUmVhZGVyO2Eub25sb2FkPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBEYXRhVmlldyhlLnRhcmdldC5yZXN1bHQpO2lmKDY1NDk2IT10LmdldFVpbnQxNigwLCExKSlyZXR1cm4gcigtMik7Zm9yKHZhciBhPXQuYnl0ZUxlbmd0aCxpPTI7aTxhOyl7aWYodC5nZXRVaW50MTYoaSsyLCExKTw9OClyZXR1cm4gcigtMSk7dmFyIHM9dC5nZXRVaW50MTYoaSwhMSk7aWYoaSs9Miw2NTUwNT09cyl7aWYoMTE2NTUxOTIwNiE9dC5nZXRVaW50MzIoaSs9MiwhMSkpcmV0dXJuIHIoLTEpO3ZhciBjPTE4NzYxPT10LmdldFVpbnQxNihpKz02LCExKTtpKz10LmdldFVpbnQzMihpKzQsYyk7dmFyIGw9dC5nZXRVaW50MTYoaSxjKTtpKz0yO2Zvcih2YXIgdT0wO3U8bDt1KyspaWYoMjc0PT10LmdldFVpbnQxNihpKzEyKnUsYykpcmV0dXJuIHIodC5nZXRVaW50MTYoaSsxMip1KzgsYykpfWVsc2V7aWYoNjUyODAhPSg2NTI4MCZzKSlicmVhaztpKz10LmdldFVpbnQxNihpLCExKX19cmV0dXJuIHIoLTEpfSxhLm9uZXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9LGEucmVhZEFzQXJyYXlCdWZmZXIoZSl9KSl9ZnVuY3Rpb24gaGFuZGxlTWF4V2lkdGhPckhlaWdodChlLHIpe3ZhciB0LGE9ZS53aWR0aCxpPWUuaGVpZ2h0LHM9ci5tYXhXaWR0aE9ySGVpZ2h0LGM9ZTtpZihpc0Zpbml0ZShzKSYmKGE+c3x8aT5zKSl7dmFyIGw9X3NsaWNlZFRvQXJyYXkoZ2V0TmV3Q2FudmFzQW5kQ3R4KGEsaSksMik7Yz1sWzBdLHQ9bFsxXSxhPmk/KGMud2lkdGg9cyxjLmhlaWdodD1pL2Eqcyk6KGMud2lkdGg9YS9pKnMsYy5oZWlnaHQ9cyksdC5kcmF3SW1hZ2UoZSwwLDAsYy53aWR0aCxjLmhlaWdodCksY2xlYW51cENhbnZhc01lbW9yeShlKX1yZXR1cm4gY31mdW5jdGlvbiBmb2xsb3dFeGlmT3JpZW50YXRpb24oZSxyKXt2YXIgdD1lLndpZHRoLGE9ZS5oZWlnaHQsaT1fc2xpY2VkVG9BcnJheShnZXROZXdDYW52YXNBbmRDdHgodCxhKSwyKSxzPWlbMF0sYz1pWzFdO3N3aXRjaChyPjQmJnI8OT8ocy53aWR0aD1hLHMuaGVpZ2h0PXQpOihzLndpZHRoPXQscy5oZWlnaHQ9YSkscil7Y2FzZSAyOmMudHJhbnNmb3JtKC0xLDAsMCwxLHQsMCk7YnJlYWs7Y2FzZSAzOmMudHJhbnNmb3JtKC0xLDAsMCwtMSx0LGEpO2JyZWFrO2Nhc2UgNDpjLnRyYW5zZm9ybSgxLDAsMCwtMSwwLGEpO2JyZWFrO2Nhc2UgNTpjLnRyYW5zZm9ybSgwLDEsMSwwLDAsMCk7YnJlYWs7Y2FzZSA2OmMudHJhbnNmb3JtKDAsMSwtMSwwLGEsMCk7YnJlYWs7Y2FzZSA3OmMudHJhbnNmb3JtKDAsLTEsLTEsMCxhLHQpO2JyZWFrO2Nhc2UgODpjLnRyYW5zZm9ybSgwLC0xLDEsMCwwLHQpfXJldHVybiBjLmRyYXdJbWFnZShlLDAsMCx0LGEpLGNsZWFudXBDYW52YXNNZW1vcnkoZSksc31mdW5jdGlvbiBjb21wcmVzcyhlLHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oYSxpKXt2YXIgcyxjLGwsdSxwLGQsaCx5LEEsZyx2LEUsbSxJLFAsYixULFM7ZnVuY3Rpb24gaW5jUHJvZ3Jlc3MoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06NTtzKz1lLHIub25Qcm9ncmVzcyhNYXRoLm1pbihzLDEwMCkpfWZ1bmN0aW9uIHNldFByb2dyZXNzKGUpe3M9TWF0aC5taW4oTWF0aC5tYXgoZSxzKSwxMDApLHIub25Qcm9ncmVzcyhzKX1yZXR1cm4gcz10LGM9ci5tYXhJdGVyYXRpb258fDEwLGw9MTAyNCpyLm1heFNpemVNQioxMDI0LGluY1Byb2dyZXNzKCksZHJhd0ZpbGVJbkNhbnZhcyhlKS50aGVuKGZ1bmN0aW9uKHQpe3RyeXt2YXIgcz1fc2xpY2VkVG9BcnJheSh0LDIpO3JldHVybiB1PXNbMV0saW5jUHJvZ3Jlc3MoKSxwPWhhbmRsZU1heFdpZHRoT3JIZWlnaHQodSxyKSxpbmNQcm9ncmVzcygpLG5ldyBQcm9taXNlKChmdW5jdGlvbih0LGEpe3ZhciBpO2lmKCEoaT1yLmV4aWZPcmllbnRhdGlvbikpcmV0dXJuIGdldEV4aWZPcmllbnRhdGlvbihlKS50aGVuKGZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gaT1lLCRJZl8yLmNhbGwodGhpcyl9Y2F0Y2goZSl7cmV0dXJuIGEoZSl9fS5iaW5kKHRoaXMpLGEpO2Z1bmN0aW9uICRJZl8yKCl7cmV0dXJuIHQoaSl9cmV0dXJuICRJZl8yLmNhbGwodGhpcyl9KSkudGhlbihmdW5jdGlvbih0KXt0cnl7cmV0dXJuIGQ9dCxpbmNQcm9ncmVzcygpLGlzQXV0b09yaWVudGF0aW9uSW5Ccm93c2VyKCkudGhlbihmdW5jdGlvbih0KXt0cnl7cmV0dXJuIGg9dD9wOmZvbGxvd0V4aWZPcmllbnRhdGlvbihwLGQpLGluY1Byb2dyZXNzKCkseT1yLmluaXRpYWxRdWFsaXR5fHwxLEE9ci5maWxlVHlwZXx8ZS50eXBlLGNhbnZhc1RvRmlsZShoLEEsZS5uYW1lLGUubGFzdE1vZGlmaWVkLHkpLnRoZW4oZnVuY3Rpb24ocil7dHJ5e3tpZihnPXIsaW5jUHJvZ3Jlc3MoKSx2PWcuc2l6ZT5sLEU9Zy5zaXplPmUuc2l6ZSwhdiYmIUUpcmV0dXJuIHNldFByb2dyZXNzKDEwMCksYShnKTt2YXIgdDtmdW5jdGlvbiAkTG9vcF8zKCl7aWYoYy0tJiYoUD5sfHxQPm0pKXt2YXIgcix0LGE9X3NsaWNlZFRvQXJyYXkoZ2V0TmV3Q2FudmFzQW5kQ3R4KHI9dj8uOTUqUy53aWR0aDpTLndpZHRoLHQ9dj8uOTUqUy5oZWlnaHQ6Uy5oZWlnaHQpLDIpO3JldHVybiBUPWFbMF0sYVsxXS5kcmF3SW1hZ2UoUywwLDAscix0KSx5Kj0uOTUsY2FudmFzVG9GaWxlKFQsQSxlLm5hbWUsZS5sYXN0TW9kaWZpZWQseSkudGhlbigoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBiPWUsY2xlYW51cENhbnZhc01lbW9yeShTKSxTPVQsUD1iLnNpemUsc2V0UHJvZ3Jlc3MoTWF0aC5taW4oOTksTWF0aC5mbG9vcigoSS1QKS8oSS1sKSoxMDApKSksJExvb3BfM31jYXRjaChlKXtyZXR1cm4gaShlKX19KSxpKX1yZXR1cm5bMV19cmV0dXJuIG09ZS5zaXplLEk9Zy5zaXplLFA9SSxTPWgsKHQ9ZnVuY3Rpb24oZSl7Zm9yKDtlOyl7aWYoZS50aGVuKXJldHVybiB2b2lkIGUudGhlbih0LGkpO3RyeXtpZihlLnBvcCl7aWYoZS5sZW5ndGgpcmV0dXJuIGUucG9wKCk/JExvb3BfM19leGl0LmNhbGwodGhpcyk6ZTtlPSRMb29wXzN9ZWxzZSBlPWUuY2FsbCh0aGlzKX1jYXRjaChlKXtyZXR1cm4gaShlKX19fS5iaW5kKHRoaXMpKSgkTG9vcF8zKTtmdW5jdGlvbiAkTG9vcF8zX2V4aXQoKXtyZXR1cm4gY2xlYW51cENhbnZhc01lbW9yeShTKSxjbGVhbnVwQ2FudmFzTWVtb3J5KFQpLGNsZWFudXBDYW52YXNNZW1vcnkocCksY2xlYW51cENhbnZhc01lbW9yeShoKSxjbGVhbnVwQ2FudmFzTWVtb3J5KHUpLHNldFByb2dyZXNzKDEwMCksYShiKX19fWNhdGNoKGUpe3JldHVybiBpKGUpfX0uYmluZCh0aGlzKSxpKX1jYXRjaChlKXtyZXR1cm4gaShlKX19LmJpbmQodGhpcyksaSl9Y2F0Y2goZSl7cmV0dXJuIGkoZSl9fS5iaW5kKHRoaXMpLGkpfWNhdGNoKGUpe3JldHVybiBpKGUpfX0uYmluZCh0aGlzKSxpKX0pKX12YXIgY2hhckF0PXN0cmluZ011bHRpYnl0ZS5jaGFyQXQsU1RSSU5HX0lURVJBVE9SPVwiU3RyaW5nIEl0ZXJhdG9yXCIsc2V0SW50ZXJuYWxTdGF0ZSQyPWludGVybmFsU3RhdGUuc2V0LGdldEludGVybmFsU3RhdGU9aW50ZXJuYWxTdGF0ZS5nZXR0ZXJGb3IoU1RSSU5HX0lURVJBVE9SKTtkZWZpbmVJdGVyYXRvcihTdHJpbmcsXCJTdHJpbmdcIiwoZnVuY3Rpb24oZSl7c2V0SW50ZXJuYWxTdGF0ZSQyKHRoaXMse3R5cGU6U1RSSU5HX0lURVJBVE9SLHN0cmluZzp0b1N0cmluZyhlKSxpbmRleDowfSl9KSwoZnVuY3Rpb24gbmV4dCgpe3ZhciBlLHI9Z2V0SW50ZXJuYWxTdGF0ZSh0aGlzKSx0PXIuc3RyaW5nLGE9ci5pbmRleDtyZXR1cm4gYT49dC5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfTooZT1jaGFyQXQodCxhKSxyLmluZGV4Kz1lLmxlbmd0aCx7dmFsdWU6ZSxkb25lOiExfSl9KSk7dmFyIGRvbUl0ZXJhYmxlcz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH0sY2xhc3NMaXN0PWRvY3VtZW50Q3JlYXRlRWxlbWVudChcInNwYW5cIikuY2xhc3NMaXN0LERPTVRva2VuTGlzdFByb3RvdHlwZT1jbGFzc0xpc3QmJmNsYXNzTGlzdC5jb25zdHJ1Y3RvciYmY2xhc3NMaXN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSxkb21Ub2tlbkxpc3RQcm90b3R5cGU9RE9NVG9rZW5MaXN0UHJvdG90eXBlPT09T2JqZWN0LnByb3RvdHlwZT92b2lkIDA6RE9NVG9rZW5MaXN0UHJvdG90eXBlLElURVJBVE9SJDI9d2VsbEtub3duU3ltYm9sKFwiaXRlcmF0b3JcIiksVE9fU1RSSU5HX1RBRz13ZWxsS25vd25TeW1ib2woXCJ0b1N0cmluZ1RhZ1wiKSxBcnJheVZhbHVlcz1lc19hcnJheV9pdGVyYXRvci52YWx1ZXMsaGFuZGxlUHJvdG90eXBlJDE9ZnVuY3Rpb24oZSxyKXtpZihlKXtpZihlW0lURVJBVE9SJDJdIT09QXJyYXlWYWx1ZXMpdHJ5e2NyZWF0ZU5vbkVudW1lcmFibGVQcm9wZXJ0eShlLElURVJBVE9SJDIsQXJyYXlWYWx1ZXMpfWNhdGNoKHIpe2VbSVRFUkFUT1IkMl09QXJyYXlWYWx1ZXN9aWYoZVtUT19TVFJJTkdfVEFHXXx8Y3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGUsVE9fU1RSSU5HX1RBRyxyKSxkb21JdGVyYWJsZXNbcl0pZm9yKHZhciB0IGluIGVzX2FycmF5X2l0ZXJhdG9yKWlmKGVbdF0hPT1lc19hcnJheV9pdGVyYXRvclt0XSl0cnl7Y3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGUsdCxlc19hcnJheV9pdGVyYXRvclt0XSl9Y2F0Y2gocil7ZVt0XT1lc19hcnJheV9pdGVyYXRvclt0XX19fTtmb3IodmFyIENPTExFQ1RJT05fTkFNRSQxIGluIGRvbUl0ZXJhYmxlcyloYW5kbGVQcm90b3R5cGUkMShnbG9iYWwkMVtDT0xMRUNUSU9OX05BTUUkMV0mJmdsb2JhbCQxW0NPTExFQ1RJT05fTkFNRSQxXS5wcm90b3R5cGUsQ09MTEVDVElPTl9OQU1FJDEpO2hhbmRsZVByb3RvdHlwZSQxKGRvbVRva2VuTGlzdFByb3RvdHlwZSxcIkRPTVRva2VuTGlzdFwiKTt2YXIgSVRFUkFUT1IkMT13ZWxsS25vd25TeW1ib2woXCJpdGVyYXRvclwiKSxuYXRpdmVVcmw9IWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPW5ldyBVUkwoXCJiP2E9MSZiPTImYz0zXCIsXCJodHRwOi8vYVwiKSxyPWUuc2VhcmNoUGFyYW1zLHQ9XCJcIjtyZXR1cm4gZS5wYXRobmFtZT1cImMlMjBkXCIsci5mb3JFYWNoKChmdW5jdGlvbihlLGEpe3IuZGVsZXRlKFwiYlwiKSx0Kz1hK2V9KSksaXNQdXJlJiYhZS50b0pTT058fCFyLnNvcnR8fFwiaHR0cDovL2EvYyUyMGQ/YT0xJmM9M1wiIT09ZS5ocmVmfHxcIjNcIiE9PXIuZ2V0KFwiY1wiKXx8XCJhPTFcIiE9PVN0cmluZyhuZXcgVVJMU2VhcmNoUGFyYW1zKFwiP2E9MVwiKSl8fCFyW0lURVJBVE9SJDFdfHxcImFcIiE9PW5ldyBVUkwoXCJodHRwczovL2FAYlwiKS51c2VybmFtZXx8XCJiXCIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoXCJhPWJcIikpLmdldChcImFcIil8fFwieG4tLWUxYXliY1wiIT09bmV3IFVSTChcImh0dHA6Ly/RgtC10YHRglwiKS5ob3N0fHxcIiMlRDAlQjFcIiE9PW5ldyBVUkwoXCJodHRwOi8vYSPQsVwiKS5oYXNofHxcImExYzNcIiE9PXR8fFwieFwiIT09bmV3IFVSTChcImh0dHA6Ly94XCIsdm9pZCAwKS5ob3N0fSkpLGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3Npbmc9ZnVuY3Rpb24oZSxyLHQsYSl7dHJ5e3JldHVybiBhP3IoYW5PYmplY3QodClbMF0sdFsxXSk6cih0KX1jYXRjaChyKXtpdGVyYXRvckNsb3NlKGUsXCJ0aHJvd1wiLHIpfX0sYXJyYXlGcm9tPWZ1bmN0aW9uIGZyb20oZSl7dmFyIHI9dG9PYmplY3QoZSksdD1pc0NvbnN0cnVjdG9yKHRoaXMpLGE9YXJndW1lbnRzLmxlbmd0aCxpPWE+MT9hcmd1bWVudHNbMV06dm9pZCAwLHM9dm9pZCAwIT09aTtzJiYoaT1mdW5jdGlvbkJpbmRDb250ZXh0KGksYT4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpO3ZhciBjLGwsdSxwLGQsaCx5PWdldEl0ZXJhdG9yTWV0aG9kKHIpLEE9MDtpZigheXx8dGhpcz09QXJyYXkmJmlzQXJyYXlJdGVyYXRvck1ldGhvZCh5KSlmb3IoYz10b0xlbmd0aChyLmxlbmd0aCksbD10P25ldyB0aGlzKGMpOkFycmF5KGMpO2M+QTtBKyspaD1zP2kocltBXSxBKTpyW0FdLGNyZWF0ZVByb3BlcnR5KGwsQSxoKTtlbHNlIGZvcihkPShwPWdldEl0ZXJhdG9yKHIseSkpLm5leHQsbD10P25ldyB0aGlzOltdOyEodT1kLmNhbGwocCkpLmRvbmU7QSsrKWg9cz9jYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKHAsaSxbdS52YWx1ZSxBXSwhMCk6dS52YWx1ZSxjcmVhdGVQcm9wZXJ0eShsLEEsaCk7cmV0dXJuIGwubGVuZ3RoPUEsbH0sbWF4SW50PTIxNDc0ODM2NDcsYmFzZT0zNix0TWluPTEsdE1heD0yNixza2V3PTM4LGRhbXA9NzAwLGluaXRpYWxCaWFzPTcyLGluaXRpYWxOPTEyOCxkZWxpbWl0ZXI9XCItXCIscmVnZXhOb25BU0NJST0vW15cXDAtXFx1MDA3RV0vLHJlZ2V4U2VwYXJhdG9ycz0vWy5cXHUzMDAyXFx1RkYwRVxcdUZGNjFdL2csT1ZFUkZMT1dfRVJST1I9XCJPdmVyZmxvdzogaW5wdXQgbmVlZHMgd2lkZXIgaW50ZWdlcnMgdG8gcHJvY2Vzc1wiLGJhc2VNaW51c1RNaW49YmFzZS10TWluLGZsb29yJDI9TWF0aC5mbG9vcixzdHJpbmdGcm9tQ2hhckNvZGU9U3RyaW5nLmZyb21DaGFyQ29kZSx1Y3MyZGVjb2RlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj1bXSx0PTAsYT1lLmxlbmd0aDt0PGE7KXt2YXIgaT1lLmNoYXJDb2RlQXQodCsrKTtpZihpPj01NTI5NiYmaTw9NTYzMTkmJnQ8YSl7dmFyIHM9ZS5jaGFyQ29kZUF0KHQrKyk7NTYzMjA9PSg2NDUxMiZzKT9yLnB1c2goKCgxMDIzJmkpPDwxMCkrKDEwMjMmcykrNjU1MzYpOihyLnB1c2goaSksdC0tKX1lbHNlIHIucHVzaChpKX1yZXR1cm4gcn0sZGlnaXRUb0Jhc2ljPWZ1bmN0aW9uKGUpe3JldHVybiBlKzIyKzc1KihlPDI2KX0sYWRhcHQ9ZnVuY3Rpb24oZSxyLHQpe3ZhciBhPTA7Zm9yKGU9dD9mbG9vciQyKGUvZGFtcCk6ZT4+MSxlKz1mbG9vciQyKGUvcik7ZT5iYXNlTWludXNUTWluKnRNYXg+PjE7YSs9YmFzZSllPWZsb29yJDIoZS9iYXNlTWludXNUTWluKTtyZXR1cm4gZmxvb3IkMihhKyhiYXNlTWludXNUTWluKzEpKmUvKGUrc2tldykpfSxlbmNvZGU9ZnVuY3Rpb24oZSl7dmFyIHIsdCxhPVtdLGk9KGU9dWNzMmRlY29kZShlKSkubGVuZ3RoLHM9aW5pdGlhbE4sYz0wLGw9aW5pdGlhbEJpYXM7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKykodD1lW3JdKTwxMjgmJmEucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUodCkpO3ZhciB1PWEubGVuZ3RoLHA9dTtmb3IodSYmYS5wdXNoKGRlbGltaXRlcik7cDxpOyl7dmFyIGQ9bWF4SW50O2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspKHQ9ZVtyXSk+PXMmJnQ8ZCYmKGQ9dCk7dmFyIGg9cCsxO2lmKGQtcz5mbG9vciQyKChtYXhJbnQtYykvaCkpdGhyb3cgUmFuZ2VFcnJvcihPVkVSRkxPV19FUlJPUik7Zm9yKGMrPShkLXMpKmgscz1kLHI9MDtyPGUubGVuZ3RoO3IrKyl7aWYoKHQ9ZVtyXSk8cyYmKytjPm1heEludCl0aHJvdyBSYW5nZUVycm9yKE9WRVJGTE9XX0VSUk9SKTtpZih0PT1zKXtmb3IodmFyIHk9YyxBPWJhc2U7O0ErPWJhc2Upe3ZhciBnPUE8PWw/dE1pbjpBPj1sK3RNYXg/dE1heDpBLWw7aWYoeTxnKWJyZWFrO3ZhciB2PXktZyxFPWJhc2UtZzthLnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhnK3YlRSkpKSx5PWZsb29yJDIodi9FKX1hLnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh5KSkpLGw9YWRhcHQoYyxoLHA9PXUpLGM9MCwrK3B9fSsrYywrK3N9cmV0dXJuIGEuam9pbihcIlwiKX0sc3RyaW5nUHVueWNvZGVUb0FzY2lpPWZ1bmN0aW9uKGUpe3ZhciByLHQsYT1bXSxpPWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycyxcIi5cIikuc3BsaXQoXCIuXCIpO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspdD1pW3JdLGEucHVzaChyZWdleE5vbkFTQ0lJLnRlc3QodCk/XCJ4bi0tXCIrZW5jb2RlKHQpOnQpO3JldHVybiBhLmpvaW4oXCIuXCIpfSxuYXRpdmVGZXRjaD1nZXRCdWlsdEluKFwiZmV0Y2hcIiksTmF0aXZlUmVxdWVzdD1nZXRCdWlsdEluKFwiUmVxdWVzdFwiKSxSZXF1ZXN0UHJvdG90eXBlPU5hdGl2ZVJlcXVlc3QmJk5hdGl2ZVJlcXVlc3QucHJvdG90eXBlLEhlYWRlcnM9Z2V0QnVpbHRJbihcIkhlYWRlcnNcIiksSVRFUkFUT1I9d2VsbEtub3duU3ltYm9sKFwiaXRlcmF0b3JcIiksVVJMX1NFQVJDSF9QQVJBTVM9XCJVUkxTZWFyY2hQYXJhbXNcIixVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUj1VUkxfU0VBUkNIX1BBUkFNUytcIkl0ZXJhdG9yXCIsc2V0SW50ZXJuYWxTdGF0ZSQxPWludGVybmFsU3RhdGUuc2V0LGdldEludGVybmFsUGFyYW1zU3RhdGU9aW50ZXJuYWxTdGF0ZS5nZXR0ZXJGb3IoVVJMX1NFQVJDSF9QQVJBTVMpLGdldEludGVybmFsSXRlcmF0b3JTdGF0ZT1pbnRlcm5hbFN0YXRlLmdldHRlckZvcihVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUikscGx1cz0vXFwrL2csc2VxdWVuY2VzPUFycmF5KDQpLHBlcmNlbnRTZXF1ZW5jZT1mdW5jdGlvbihlKXtyZXR1cm4gc2VxdWVuY2VzW2UtMV18fChzZXF1ZW5jZXNbZS0xXT1SZWdFeHAoXCIoKD86JVtcXFxcZGEtZl17Mn0pe1wiK2UrXCJ9KVwiLFwiZ2lcIikpfSxwZXJjZW50RGVjb2RlPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGUpfWNhdGNoKHIpe3JldHVybiBlfX0sZGVzZXJpYWxpemU9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5yZXBsYWNlKHBsdXMsXCIgXCIpLHQ9NDt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChyKX1jYXRjaChlKXtmb3IoO3Q7KXI9ci5yZXBsYWNlKHBlcmNlbnRTZXF1ZW5jZSh0LS0pLHBlcmNlbnREZWNvZGUpO3JldHVybiByfX0sZmluZD0vWyEnKCl+XXwlMjAvZyxyZXBsYWNlJDE9e1wiIVwiOlwiJTIxXCIsXCInXCI6XCIlMjdcIixcIihcIjpcIiUyOFwiLFwiKVwiOlwiJTI5XCIsXCJ+XCI6XCIlN0VcIixcIiUyMFwiOlwiK1wifSxyZXBsYWNlcj1mdW5jdGlvbihlKXtyZXR1cm4gcmVwbGFjZSQxW2VdfSxzZXJpYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKGZpbmQscmVwbGFjZXIpfSxwYXJzZVNlYXJjaFBhcmFtcz1mdW5jdGlvbihlLHIpe2lmKHIpZm9yKHZhciB0LGEsaT1yLnNwbGl0KFwiJlwiKSxzPTA7czxpLmxlbmd0aDspKHQ9aVtzKytdKS5sZW5ndGgmJihhPXQuc3BsaXQoXCI9XCIpLGUucHVzaCh7a2V5OmRlc2VyaWFsaXplKGEuc2hpZnQoKSksdmFsdWU6ZGVzZXJpYWxpemUoYS5qb2luKFwiPVwiKSl9KSl9LHVwZGF0ZVNlYXJjaFBhcmFtcz1mdW5jdGlvbihlKXt0aGlzLmVudHJpZXMubGVuZ3RoPTAscGFyc2VTZWFyY2hQYXJhbXModGhpcy5lbnRyaWVzLGUpfSx2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aD1mdW5jdGlvbihlLHIpe2lmKGU8cil0aHJvdyBUeXBlRXJyb3IoXCJOb3QgZW5vdWdoIGFyZ3VtZW50c1wiKX0sVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3I9Y3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvcigoZnVuY3Rpb24gSXRlcmF0b3IoZSxyKXtzZXRJbnRlcm5hbFN0YXRlJDEodGhpcyx7dHlwZTpVUkxfU0VBUkNIX1BBUkFNU19JVEVSQVRPUixpdGVyYXRvcjpnZXRJdGVyYXRvcihnZXRJbnRlcm5hbFBhcmFtc1N0YXRlKGUpLmVudHJpZXMpLGtpbmQ6cn0pfSksXCJJdGVyYXRvclwiLChmdW5jdGlvbiBuZXh0KCl7dmFyIGU9Z2V0SW50ZXJuYWxJdGVyYXRvclN0YXRlKHRoaXMpLHI9ZS5raW5kLHQ9ZS5pdGVyYXRvci5uZXh0KCksYT10LnZhbHVlO3JldHVybiB0LmRvbmV8fCh0LnZhbHVlPVwia2V5c1wiPT09cj9hLmtleTpcInZhbHVlc1wiPT09cj9hLnZhbHVlOlthLmtleSxhLnZhbHVlXSksdH0pKSxVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3Rvcj1mdW5jdGlvbiBVUkxTZWFyY2hQYXJhbXMoKXthbkluc3RhbmNlKHRoaXMsVVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IsVVJMX1NFQVJDSF9QQVJBTVMpO3ZhciBlLHIsdCxhLGkscyxjLGwsdSxwPWFyZ3VtZW50cy5sZW5ndGg+MD9hcmd1bWVudHNbMF06dm9pZCAwLGQ9dGhpcyxoPVtdO2lmKHNldEludGVybmFsU3RhdGUkMShkLHt0eXBlOlVSTF9TRUFSQ0hfUEFSQU1TLGVudHJpZXM6aCx1cGRhdGVVUkw6ZnVuY3Rpb24oKXt9LHVwZGF0ZVNlYXJjaFBhcmFtczp1cGRhdGVTZWFyY2hQYXJhbXN9KSx2b2lkIDAhPT1wKWlmKGlzT2JqZWN0KHApKWlmKGU9Z2V0SXRlcmF0b3JNZXRob2QocCkpZm9yKHQ9KHI9Z2V0SXRlcmF0b3IocCxlKSkubmV4dDshKGE9dC5jYWxsKHIpKS5kb25lOyl7aWYoKGM9KHM9KGk9Z2V0SXRlcmF0b3IoYW5PYmplY3QoYS52YWx1ZSkpKS5uZXh0KS5jYWxsKGkpKS5kb25lfHwobD1zLmNhbGwoaSkpLmRvbmV8fCFzLmNhbGwoaSkuZG9uZSl0aHJvdyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyXCIpO2gucHVzaCh7a2V5OnRvU3RyaW5nKGMudmFsdWUpLHZhbHVlOnRvU3RyaW5nKGwudmFsdWUpfSl9ZWxzZSBmb3IodSBpbiBwKWhhcyQxKHAsdSkmJmgucHVzaCh7a2V5OnUsdmFsdWU6dG9TdHJpbmcocFt1XSl9KTtlbHNlIHBhcnNlU2VhcmNoUGFyYW1zKGgsXCJzdHJpbmdcIj09dHlwZW9mIHA/XCI/XCI9PT1wLmNoYXJBdCgwKT9wLnNsaWNlKDEpOnA6dG9TdHJpbmcocCkpfSxVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGU9VVJMU2VhcmNoUGFyYW1zQ29uc3RydWN0b3IucHJvdG90eXBlO2lmKHJlZGVmaW5lQWxsKFVSTFNlYXJjaFBhcmFtc1Byb3RvdHlwZSx7YXBwZW5kOmZ1bmN0aW9uIGFwcGVuZChlLHIpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIHQ9Z2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKTt0LmVudHJpZXMucHVzaCh7a2V5OnRvU3RyaW5nKGUpLHZhbHVlOnRvU3RyaW5nKHIpfSksdC51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhbGlkYXRlQXJndW1lbnRzTGVuZ3RoKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciByPWdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyksdD1yLmVudHJpZXMsYT10b1N0cmluZyhlKSxpPTA7aTx0Lmxlbmd0aDspdFtpXS5rZXk9PT1hP3Quc3BsaWNlKGksMSk6aSsrO3IudXBkYXRlVVJMKCl9LGdldDpmdW5jdGlvbiBnZXQoZSl7dmFsaWRhdGVBcmd1bWVudHNMZW5ndGgoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHI9Z2V0SW50ZXJuYWxQYXJhbXNTdGF0ZSh0aGlzKS5lbnRyaWVzLHQ9dG9TdHJpbmcoZSksYT0wO2E8ci5sZW5ndGg7YSsrKWlmKHJbYV0ua2V5PT09dClyZXR1cm4gclthXS52YWx1ZTtyZXR1cm4gbnVsbH0sZ2V0QWxsOmZ1bmN0aW9uIGdldEFsbChlKXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1nZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXMsdD10b1N0cmluZyhlKSxhPVtdLGk9MDtpPHIubGVuZ3RoO2krKylyW2ldLmtleT09PXQmJmEucHVzaChyW2ldLnZhbHVlKTtyZXR1cm4gYX0saGFzOmZ1bmN0aW9uIGhhcyhlKXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgcj1nZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLmVudHJpZXMsdD10b1N0cmluZyhlKSxhPTA7YTxyLmxlbmd0aDspaWYoclthKytdLmtleT09PXQpcmV0dXJuITA7cmV0dXJuITF9LHNldDpmdW5jdGlvbiBzZXQoZSxyKXt2YWxpZGF0ZUFyZ3VtZW50c0xlbmd0aChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgdCxhPWdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcyksaT1hLmVudHJpZXMscz0hMSxjPXRvU3RyaW5nKGUpLGw9dG9TdHJpbmcociksdT0wO3U8aS5sZW5ndGg7dSsrKSh0PWlbdV0pLmtleT09PWMmJihzP2kuc3BsaWNlKHUtLSwxKToocz0hMCx0LnZhbHVlPWwpKTtzfHxpLnB1c2goe2tleTpjLHZhbHVlOmx9KSxhLnVwZGF0ZVVSTCgpfSxzb3J0OmZ1bmN0aW9uIHNvcnQoKXt2YXIgZSxyLHQsYT1nZXRJbnRlcm5hbFBhcmFtc1N0YXRlKHRoaXMpLGk9YS5lbnRyaWVzLHM9aS5zbGljZSgpO2ZvcihpLmxlbmd0aD0wLHQ9MDt0PHMubGVuZ3RoO3QrKyl7Zm9yKGU9c1t0XSxyPTA7cjx0O3IrKylpZihpW3JdLmtleT5lLmtleSl7aS5zcGxpY2UociwwLGUpO2JyZWFrfXI9PT10JiZpLnB1c2goZSl9YS51cGRhdGVVUkwoKX0sZm9yRWFjaDpmdW5jdGlvbiBmb3JFYWNoKGUpe2Zvcih2YXIgcix0PWdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcyxhPWZ1bmN0aW9uQmluZENvbnRleHQoZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxpPTA7aTx0Lmxlbmd0aDspYSgocj10W2krK10pLnZhbHVlLHIua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsXCJrZXlzXCIpfSx2YWx1ZXM6ZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXNJdGVyYXRvcih0aGlzLFwidmFsdWVzXCIpfSxlbnRyaWVzOmZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gbmV3IFVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yKHRoaXMsXCJlbnRyaWVzXCIpfX0se2VudW1lcmFibGU6ITB9KSxyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsSVRFUkFUT1IsVVJMU2VhcmNoUGFyYW1zUHJvdG90eXBlLmVudHJpZXMse25hbWU6XCJlbnRyaWVzXCJ9KSxyZWRlZmluZShVUkxTZWFyY2hQYXJhbXNQcm90b3R5cGUsXCJ0b1N0cmluZ1wiLChmdW5jdGlvbiB0b1N0cmluZygpe2Zvcih2YXIgZSxyPWdldEludGVybmFsUGFyYW1zU3RhdGUodGhpcykuZW50cmllcyx0PVtdLGE9MDthPHIubGVuZ3RoOyllPXJbYSsrXSx0LnB1c2goc2VyaWFsaXplKGUua2V5KStcIj1cIitzZXJpYWxpemUoZS52YWx1ZSkpO3JldHVybiB0LmpvaW4oXCImXCIpfSkse2VudW1lcmFibGU6ITB9KSxzZXRUb1N0cmluZ1RhZyhVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixVUkxfU0VBUkNIX1BBUkFNUyksX2V4cG9ydCh7Z2xvYmFsOiEwLGZvcmNlZDohbmF0aXZlVXJsfSx7VVJMU2VhcmNoUGFyYW1zOlVSTFNlYXJjaFBhcmFtc0NvbnN0cnVjdG9yfSksIW5hdGl2ZVVybCYmaXNDYWxsYWJsZShIZWFkZXJzKSl7dmFyIHdyYXBSZXF1ZXN0T3B0aW9ucz1mdW5jdGlvbihlKXtpZihpc09iamVjdChlKSl7dmFyIHIsdD1lLmJvZHk7aWYoY2xhc3NvZih0KT09PVVSTF9TRUFSQ0hfUEFSQU1TKXJldHVybihyPWUuaGVhZGVycz9uZXcgSGVhZGVycyhlLmhlYWRlcnMpOm5ldyBIZWFkZXJzKS5oYXMoXCJjb250ZW50LXR5cGVcIil8fHIuc2V0KFwiY29udGVudC10eXBlXCIsXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOFwiKSxvYmplY3RDcmVhdGUoZSx7Ym9keTpjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCxTdHJpbmcodCkpLGhlYWRlcnM6Y3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDAscil9KX1yZXR1cm4gZX07aWYoaXNDYWxsYWJsZShuYXRpdmVGZXRjaCkmJl9leHBvcnQoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uIGZldGNoKGUpe3JldHVybiBuYXRpdmVGZXRjaChlLGFyZ3VtZW50cy5sZW5ndGg+MT93cmFwUmVxdWVzdE9wdGlvbnMoYXJndW1lbnRzWzFdKTp7fSl9fSksaXNDYWxsYWJsZShOYXRpdmVSZXF1ZXN0KSl7dmFyIFJlcXVlc3RDb25zdHJ1Y3Rvcj1mdW5jdGlvbiBSZXF1ZXN0KGUpe3JldHVybiBhbkluc3RhbmNlKHRoaXMsUmVxdWVzdENvbnN0cnVjdG9yLFwiUmVxdWVzdFwiKSxuZXcgTmF0aXZlUmVxdWVzdChlLGFyZ3VtZW50cy5sZW5ndGg+MT93cmFwUmVxdWVzdE9wdGlvbnMoYXJndW1lbnRzWzFdKTp7fSl9O1JlcXVlc3RQcm90b3R5cGUuY29uc3RydWN0b3I9UmVxdWVzdENvbnN0cnVjdG9yLFJlcXVlc3RDb25zdHJ1Y3Rvci5wcm90b3R5cGU9UmVxdWVzdFByb3RvdHlwZSxfZXhwb3J0KHtnbG9iYWw6ITAsZm9yY2VkOiEwfSx7UmVxdWVzdDpSZXF1ZXN0Q29uc3RydWN0b3J9KX19dmFyIHdlYl91cmxTZWFyY2hQYXJhbXM9e1VSTFNlYXJjaFBhcmFtczpVUkxTZWFyY2hQYXJhbXNDb25zdHJ1Y3RvcixnZXRTdGF0ZTpnZXRJbnRlcm5hbFBhcmFtc1N0YXRlfSxjb2RlQXQ9c3RyaW5nTXVsdGlieXRlLmNvZGVBdCxOYXRpdmVVUkw9Z2xvYmFsJDEuVVJMLFVSTFNlYXJjaFBhcmFtcyQxPXdlYl91cmxTZWFyY2hQYXJhbXMuVVJMU2VhcmNoUGFyYW1zLGdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGU9d2ViX3VybFNlYXJjaFBhcmFtcy5nZXRTdGF0ZSxzZXRJbnRlcm5hbFN0YXRlPWludGVybmFsU3RhdGUuc2V0LGdldEludGVybmFsVVJMU3RhdGU9aW50ZXJuYWxTdGF0ZS5nZXR0ZXJGb3IoXCJVUkxcIiksZmxvb3IkMT1NYXRoLmZsb29yLHBvdz1NYXRoLnBvdyxJTlZBTElEX0FVVEhPUklUWT1cIkludmFsaWQgYXV0aG9yaXR5XCIsSU5WQUxJRF9TQ0hFTUU9XCJJbnZhbGlkIHNjaGVtZVwiLElOVkFMSURfSE9TVD1cIkludmFsaWQgaG9zdFwiLElOVkFMSURfUE9SVD1cIkludmFsaWQgcG9ydFwiLEFMUEhBPS9bQS1aYS16XS8sQUxQSEFOVU1FUklDPS9bXFxkKy0uQS1aYS16XS8sRElHSVQ9L1xcZC8sSEVYX1NUQVJUPS9eMHgvaSxPQ1Q9L15bMC03XSskLyxERUM9L15cXGQrJC8sSEVYPS9eW1xcZEEtRmEtZl0rJC8sRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVD0vW1xcMFxcdFxcblxcciAjJS86PD4/QFtcXFxcXFxdXnxdLyxGT1JCSURERU5fSE9TVF9DT0RFX1BPSU5UX0VYQ0xVRElOR19QRVJDRU5UPS9bXFwwXFx0XFxuXFxyICMvOjw+P0BbXFxcXFxcXV58XS8sTEVBRElOR19BTkRfVFJBSUxJTkdfQzBfQ09OVFJPTF9PUl9TUEFDRT0vXltcXHUwMDAwLVxcdTAwMjBdK3xbXFx1MDAwMC1cXHUwMDIwXSskL2csVEFCX0FORF9ORVdfTElORT0vW1xcdFxcblxccl0vZyxFT0YscGFyc2VIb3N0PWZ1bmN0aW9uKGUscil7dmFyIHQsYSxpO2lmKFwiW1wiPT1yLmNoYXJBdCgwKSl7aWYoXCJdXCIhPXIuY2hhckF0KHIubGVuZ3RoLTEpKXJldHVybiBJTlZBTElEX0hPU1Q7aWYoISh0PXBhcnNlSVB2NihyLnNsaWNlKDEsLTEpKSkpcmV0dXJuIElOVkFMSURfSE9TVDtlLmhvc3Q9dH1lbHNlIGlmKGlzU3BlY2lhbChlKSl7aWYocj1zdHJpbmdQdW55Y29kZVRvQXNjaWkociksRk9SQklEREVOX0hPU1RfQ09ERV9QT0lOVC50ZXN0KHIpKXJldHVybiBJTlZBTElEX0hPU1Q7aWYobnVsbD09PSh0PXBhcnNlSVB2NChyKSkpcmV0dXJuIElOVkFMSURfSE9TVDtlLmhvc3Q9dH1lbHNle2lmKEZPUkJJRERFTl9IT1NUX0NPREVfUE9JTlRfRVhDTFVESU5HX1BFUkNFTlQudGVzdChyKSlyZXR1cm4gSU5WQUxJRF9IT1NUO2Zvcih0PVwiXCIsYT1hcnJheUZyb20ociksaT0wO2k8YS5sZW5ndGg7aSsrKXQrPXBlcmNlbnRFbmNvZGUoYVtpXSxDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KTtlLmhvc3Q9dH19LHBhcnNlSVB2ND1mdW5jdGlvbihlKXt2YXIgcix0LGEsaSxzLGMsbCx1PWUuc3BsaXQoXCIuXCIpO2lmKHUubGVuZ3RoJiZcIlwiPT11W3UubGVuZ3RoLTFdJiZ1LnBvcCgpLChyPXUubGVuZ3RoKT40KXJldHVybiBlO2Zvcih0PVtdLGE9MDthPHI7YSsrKXtpZihcIlwiPT0oaT11W2FdKSlyZXR1cm4gZTtpZihzPTEwLGkubGVuZ3RoPjEmJlwiMFwiPT1pLmNoYXJBdCgwKSYmKHM9SEVYX1NUQVJULnRlc3QoaSk/MTY6OCxpPWkuc2xpY2UoOD09cz8xOjIpKSxcIlwiPT09aSljPTA7ZWxzZXtpZighKDEwPT1zP0RFQzo4PT1zP09DVDpIRVgpLnRlc3QoaSkpcmV0dXJuIGU7Yz1wYXJzZUludChpLHMpfXQucHVzaChjKX1mb3IoYT0wO2E8cjthKyspaWYoYz10W2FdLGE9PXItMSl7aWYoYz49cG93KDI1Niw1LXIpKXJldHVybiBudWxsfWVsc2UgaWYoYz4yNTUpcmV0dXJuIG51bGw7Zm9yKGw9dC5wb3AoKSxhPTA7YTx0Lmxlbmd0aDthKyspbCs9dFthXSpwb3coMjU2LDMtYSk7cmV0dXJuIGx9LHBhcnNlSVB2Nj1mdW5jdGlvbihlKXt2YXIgcix0LGEsaSxzLGMsbCx1PVswLDAsMCwwLDAsMCwwLDBdLHA9MCxkPW51bGwsaD0wLGNocj1mdW5jdGlvbigpe3JldHVybiBlLmNoYXJBdChoKX07aWYoXCI6XCI9PWNocigpKXtpZihcIjpcIiE9ZS5jaGFyQXQoMSkpcmV0dXJuO2grPTIsZD0rK3B9Zm9yKDtjaHIoKTspe2lmKDg9PXApcmV0dXJuO2lmKFwiOlwiIT1jaHIoKSl7Zm9yKHI9dD0wO3Q8NCYmSEVYLnRlc3QoY2hyKCkpOylyPTE2KnIrcGFyc2VJbnQoY2hyKCksMTYpLGgrKyx0Kys7aWYoXCIuXCI9PWNocigpKXtpZigwPT10KXJldHVybjtpZihoLT10LHA+NilyZXR1cm47Zm9yKGE9MDtjaHIoKTspe2lmKGk9bnVsbCxhPjApe2lmKCEoXCIuXCI9PWNocigpJiZhPDQpKXJldHVybjtoKyt9aWYoIURJR0lULnRlc3QoY2hyKCkpKXJldHVybjtmb3IoO0RJR0lULnRlc3QoY2hyKCkpOyl7aWYocz1wYXJzZUludChjaHIoKSwxMCksbnVsbD09PWkpaT1zO2Vsc2V7aWYoMD09aSlyZXR1cm47aT0xMCppK3N9aWYoaT4yNTUpcmV0dXJuO2grK311W3BdPTI1Nip1W3BdK2ksMiE9KythJiY0IT1hfHxwKyt9aWYoNCE9YSlyZXR1cm47YnJlYWt9aWYoXCI6XCI9PWNocigpKXtpZihoKyssIWNocigpKXJldHVybn1lbHNlIGlmKGNocigpKXJldHVybjt1W3ArK109cn1lbHNle2lmKG51bGwhPT1kKXJldHVybjtoKyssZD0rK3B9fWlmKG51bGwhPT1kKWZvcihjPXAtZCxwPTc7MCE9cCYmYz4wOylsPXVbcF0sdVtwLS1dPXVbZCtjLTFdLHVbZCstLWNdPWw7ZWxzZSBpZig4IT1wKXJldHVybjtyZXR1cm4gdX0sZmluZExvbmdlc3RaZXJvU2VxdWVuY2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPW51bGwsdD0xLGE9bnVsbCxpPTAscz0wO3M8ODtzKyspMCE9PWVbc10/KGk+dCYmKHI9YSx0PWkpLGE9bnVsbCxpPTApOihudWxsPT09YSYmKGE9cyksKytpKTtyZXR1cm4gaT50JiYocj1hLHQ9aSkscn0sc2VyaWFsaXplSG9zdD1mdW5jdGlvbihlKXt2YXIgcix0LGEsaTtpZihcIm51bWJlclwiPT10eXBlb2YgZSl7Zm9yKHI9W10sdD0wO3Q8NDt0Kyspci51bnNoaWZ0KGUlMjU2KSxlPWZsb29yJDEoZS8yNTYpO3JldHVybiByLmpvaW4oXCIuXCIpfWlmKFwib2JqZWN0XCI9PXR5cGVvZiBlKXtmb3Iocj1cIlwiLGE9ZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoZSksdD0wO3Q8ODt0KyspaSYmMD09PWVbdF18fChpJiYoaT0hMSksYT09PXQ/KHIrPXQ/XCI6XCI6XCI6OlwiLGk9ITApOihyKz1lW3RdLnRvU3RyaW5nKDE2KSx0PDcmJihyKz1cIjpcIikpKTtyZXR1cm5cIltcIityK1wiXVwifXJldHVybiBlfSxDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0PXt9LGZyYWdtZW50UGVyY2VudEVuY29kZVNldD1vYmplY3RBc3NpZ24oe30sQzBDb250cm9sUGVyY2VudEVuY29kZVNldCx7XCIgXCI6MSwnXCInOjEsXCI8XCI6MSxcIj5cIjoxLFwiYFwiOjF9KSxwYXRoUGVyY2VudEVuY29kZVNldD1vYmplY3RBc3NpZ24oe30sZnJhZ21lbnRQZXJjZW50RW5jb2RlU2V0LHtcIiNcIjoxLFwiP1wiOjEsXCJ7XCI6MSxcIn1cIjoxfSksdXNlcmluZm9QZXJjZW50RW5jb2RlU2V0PW9iamVjdEFzc2lnbih7fSxwYXRoUGVyY2VudEVuY29kZVNldCx7XCIvXCI6MSxcIjpcIjoxLFwiO1wiOjEsXCI9XCI6MSxcIkBcIjoxLFwiW1wiOjEsXCJcXFxcXCI6MSxcIl1cIjoxLFwiXlwiOjEsXCJ8XCI6MX0pLHBlcmNlbnRFbmNvZGU9ZnVuY3Rpb24oZSxyKXt2YXIgdD1jb2RlQXQoZSwwKTtyZXR1cm4gdD4zMiYmdDwxMjcmJiFoYXMkMShyLGUpP2U6ZW5jb2RlVVJJQ29tcG9uZW50KGUpfSxzcGVjaWFsU2NoZW1lcz17ZnRwOjIxLGZpbGU6bnVsbCxodHRwOjgwLGh0dHBzOjQ0Myx3czo4MCx3c3M6NDQzfSxpc1NwZWNpYWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGhhcyQxKHNwZWNpYWxTY2hlbWVzLGUuc2NoZW1lKX0saW5jbHVkZXNDcmVkZW50aWFscz1mdW5jdGlvbihlKXtyZXR1cm5cIlwiIT1lLnVzZXJuYW1lfHxcIlwiIT1lLnBhc3N3b3JkfSxjYW5ub3RIYXZlVXNlcm5hbWVQYXNzd29yZFBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIWUuaG9zdHx8ZS5jYW5ub3RCZUFCYXNlVVJMfHxcImZpbGVcIj09ZS5zY2hlbWV9LGlzV2luZG93c0RyaXZlTGV0dGVyPWZ1bmN0aW9uKGUscil7dmFyIHQ7cmV0dXJuIDI9PWUubGVuZ3RoJiZBTFBIQS50ZXN0KGUuY2hhckF0KDApKSYmKFwiOlwiPT0odD1lLmNoYXJBdCgxKSl8fCFyJiZcInxcIj09dCl9LHN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXI9ZnVuY3Rpb24oZSl7dmFyIHI7cmV0dXJuIGUubGVuZ3RoPjEmJmlzV2luZG93c0RyaXZlTGV0dGVyKGUuc2xpY2UoMCwyKSkmJigyPT1lLmxlbmd0aHx8XCIvXCI9PT0ocj1lLmNoYXJBdCgyKSl8fFwiXFxcXFwiPT09cnx8XCI/XCI9PT1yfHxcIiNcIj09PXIpfSxzaG9ydGVuVVJMc1BhdGg9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wYXRoLHQ9ci5sZW5ndGg7IXR8fFwiZmlsZVwiPT1lLnNjaGVtZSYmMT09dCYmaXNXaW5kb3dzRHJpdmVMZXR0ZXIoclswXSwhMCl8fHIucG9wKCl9LGlzU2luZ2xlRG90PWZ1bmN0aW9uKGUpe3JldHVyblwiLlwiPT09ZXx8XCIlMmVcIj09PWUudG9Mb3dlckNhc2UoKX0saXNEb3VibGVEb3Q9ZnVuY3Rpb24oZSl7cmV0dXJuXCIuLlwiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKXx8XCIlMmUuXCI9PT1lfHxcIi4lMmVcIj09PWV8fFwiJTJlJTJlXCI9PT1lfSxTQ0hFTUVfU1RBUlQ9e30sU0NIRU1FPXt9LE5PX1NDSEVNRT17fSxTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWT17fSxQQVRIX09SX0FVVEhPUklUWT17fSxSRUxBVElWRT17fSxSRUxBVElWRV9TTEFTSD17fSxTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTPXt9LFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTPXt9LEFVVEhPUklUWT17fSxIT1NUPXt9LEhPU1ROQU1FPXt9LFBPUlQ9e30sRklMRT17fSxGSUxFX1NMQVNIPXt9LEZJTEVfSE9TVD17fSxQQVRIX1NUQVJUPXt9LFBBVEg9e30sQ0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSD17fSxRVUVSWT17fSxGUkFHTUVOVD17fSxwYXJzZVVSTD1mdW5jdGlvbihlLHIsdCxhKXt2YXIgaSxzLGMsbCx1PXR8fFNDSEVNRV9TVEFSVCxwPTAsZD1cIlwiLGg9ITEseT0hMSxBPSExO2Zvcih0fHwoZS5zY2hlbWU9XCJcIixlLnVzZXJuYW1lPVwiXCIsZS5wYXNzd29yZD1cIlwiLGUuaG9zdD1udWxsLGUucG9ydD1udWxsLGUucGF0aD1bXSxlLnF1ZXJ5PW51bGwsZS5mcmFnbWVudD1udWxsLGUuY2Fubm90QmVBQmFzZVVSTD0hMSxyPXIucmVwbGFjZShMRUFESU5HX0FORF9UUkFJTElOR19DMF9DT05UUk9MX09SX1NQQUNFLFwiXCIpKSxyPXIucmVwbGFjZShUQUJfQU5EX05FV19MSU5FLFwiXCIpLGk9YXJyYXlGcm9tKHIpO3A8PWkubGVuZ3RoOyl7c3dpdGNoKHM9aVtwXSx1KXtjYXNlIFNDSEVNRV9TVEFSVDppZighc3x8IUFMUEhBLnRlc3Qocykpe2lmKHQpcmV0dXJuIElOVkFMSURfU0NIRU1FO3U9Tk9fU0NIRU1FO2NvbnRpbnVlfWQrPXMudG9Mb3dlckNhc2UoKSx1PVNDSEVNRTticmVhaztjYXNlIFNDSEVNRTppZihzJiYoQUxQSEFOVU1FUklDLnRlc3Qocyl8fFwiK1wiPT1zfHxcIi1cIj09c3x8XCIuXCI9PXMpKWQrPXMudG9Mb3dlckNhc2UoKTtlbHNle2lmKFwiOlwiIT1zKXtpZih0KXJldHVybiBJTlZBTElEX1NDSEVNRTtkPVwiXCIsdT1OT19TQ0hFTUUscD0wO2NvbnRpbnVlfWlmKHQmJihpc1NwZWNpYWwoZSkhPWhhcyQxKHNwZWNpYWxTY2hlbWVzLGQpfHxcImZpbGVcIj09ZCYmKGluY2x1ZGVzQ3JlZGVudGlhbHMoZSl8fG51bGwhPT1lLnBvcnQpfHxcImZpbGVcIj09ZS5zY2hlbWUmJiFlLmhvc3QpKXJldHVybjtpZihlLnNjaGVtZT1kLHQpcmV0dXJuIHZvaWQoaXNTcGVjaWFsKGUpJiZzcGVjaWFsU2NoZW1lc1tlLnNjaGVtZV09PWUucG9ydCYmKGUucG9ydD1udWxsKSk7ZD1cIlwiLFwiZmlsZVwiPT1lLnNjaGVtZT91PUZJTEU6aXNTcGVjaWFsKGUpJiZhJiZhLnNjaGVtZT09ZS5zY2hlbWU/dT1TUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTppc1NwZWNpYWwoZSk/dT1TUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOlwiL1wiPT1pW3ArMV0/KHU9UEFUSF9PUl9BVVRIT1JJVFkscCsrKTooZS5jYW5ub3RCZUFCYXNlVVJMPSEwLGUucGF0aC5wdXNoKFwiXCIpLHU9Q0FOTk9UX0JFX0FfQkFTRV9VUkxfUEFUSCl9YnJlYWs7Y2FzZSBOT19TQ0hFTUU6aWYoIWF8fGEuY2Fubm90QmVBQmFzZVVSTCYmXCIjXCIhPXMpcmV0dXJuIElOVkFMSURfU0NIRU1FO2lmKGEuY2Fubm90QmVBQmFzZVVSTCYmXCIjXCI9PXMpe2Uuc2NoZW1lPWEuc2NoZW1lLGUucGF0aD1hLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PWEucXVlcnksZS5mcmFnbWVudD1cIlwiLGUuY2Fubm90QmVBQmFzZVVSTD0hMCx1PUZSQUdNRU5UO2JyZWFrfXU9XCJmaWxlXCI9PWEuc2NoZW1lP0ZJTEU6UkVMQVRJVkU7Y29udGludWU7Y2FzZSBTUEVDSUFMX1JFTEFUSVZFX09SX0FVVEhPUklUWTppZihcIi9cIiE9c3x8XCIvXCIhPWlbcCsxXSl7dT1SRUxBVElWRTtjb250aW51ZX11PVNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTLHArKzticmVhaztjYXNlIFBBVEhfT1JfQVVUSE9SSVRZOmlmKFwiL1wiPT1zKXt1PUFVVEhPUklUWTticmVha311PVBBVEg7Y29udGludWU7Y2FzZSBSRUxBVElWRTppZihlLnNjaGVtZT1hLnNjaGVtZSxzPT1FT0YpZS51c2VybmFtZT1hLnVzZXJuYW1lLGUucGFzc3dvcmQ9YS5wYXNzd29yZCxlLmhvc3Q9YS5ob3N0LGUucG9ydD1hLnBvcnQsZS5wYXRoPWEucGF0aC5zbGljZSgpLGUucXVlcnk9YS5xdWVyeTtlbHNlIGlmKFwiL1wiPT1zfHxcIlxcXFxcIj09cyYmaXNTcGVjaWFsKGUpKXU9UkVMQVRJVkVfU0xBU0g7ZWxzZSBpZihcIj9cIj09cyllLnVzZXJuYW1lPWEudXNlcm5hbWUsZS5wYXNzd29yZD1hLnBhc3N3b3JkLGUuaG9zdD1hLmhvc3QsZS5wb3J0PWEucG9ydCxlLnBhdGg9YS5wYXRoLnNsaWNlKCksZS5xdWVyeT1cIlwiLHU9UVVFUlk7ZWxzZXtpZihcIiNcIiE9cyl7ZS51c2VybmFtZT1hLnVzZXJuYW1lLGUucGFzc3dvcmQ9YS5wYXNzd29yZCxlLmhvc3Q9YS5ob3N0LGUucG9ydD1hLnBvcnQsZS5wYXRoPWEucGF0aC5zbGljZSgpLGUucGF0aC5wb3AoKSx1PVBBVEg7Y29udGludWV9ZS51c2VybmFtZT1hLnVzZXJuYW1lLGUucGFzc3dvcmQ9YS5wYXNzd29yZCxlLmhvc3Q9YS5ob3N0LGUucG9ydD1hLnBvcnQsZS5wYXRoPWEucGF0aC5zbGljZSgpLGUucXVlcnk9YS5xdWVyeSxlLmZyYWdtZW50PVwiXCIsdT1GUkFHTUVOVH1icmVhaztjYXNlIFJFTEFUSVZFX1NMQVNIOmlmKCFpc1NwZWNpYWwoZSl8fFwiL1wiIT1zJiZcIlxcXFxcIiE9cyl7aWYoXCIvXCIhPXMpe2UudXNlcm5hbWU9YS51c2VybmFtZSxlLnBhc3N3b3JkPWEucGFzc3dvcmQsZS5ob3N0PWEuaG9zdCxlLnBvcnQ9YS5wb3J0LHU9UEFUSDtjb250aW51ZX11PUFVVEhPUklUWX1lbHNlIHU9U1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVM7YnJlYWs7Y2FzZSBTUEVDSUFMX0FVVEhPUklUWV9TTEFTSEVTOmlmKHU9U1BFQ0lBTF9BVVRIT1JJVFlfSUdOT1JFX1NMQVNIRVMsXCIvXCIhPXN8fFwiL1wiIT1kLmNoYXJBdChwKzEpKWNvbnRpbnVlO3ArKzticmVhaztjYXNlIFNQRUNJQUxfQVVUSE9SSVRZX0lHTk9SRV9TTEFTSEVTOmlmKFwiL1wiIT1zJiZcIlxcXFxcIiE9cyl7dT1BVVRIT1JJVFk7Y29udGludWV9YnJlYWs7Y2FzZSBBVVRIT1JJVFk6aWYoXCJAXCI9PXMpe2gmJihkPVwiJTQwXCIrZCksaD0hMCxjPWFycmF5RnJvbShkKTtmb3IodmFyIGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIHY9Y1tnXTtpZihcIjpcIiE9dnx8QSl7dmFyIEU9cGVyY2VudEVuY29kZSh2LHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCk7QT9lLnBhc3N3b3JkKz1FOmUudXNlcm5hbWUrPUV9ZWxzZSBBPSEwfWQ9XCJcIn1lbHNlIGlmKHM9PUVPRnx8XCIvXCI9PXN8fFwiP1wiPT1zfHxcIiNcIj09c3x8XCJcXFxcXCI9PXMmJmlzU3BlY2lhbChlKSl7aWYoaCYmXCJcIj09ZClyZXR1cm4gSU5WQUxJRF9BVVRIT1JJVFk7cC09YXJyYXlGcm9tKGQpLmxlbmd0aCsxLGQ9XCJcIix1PUhPU1R9ZWxzZSBkKz1zO2JyZWFrO2Nhc2UgSE9TVDpjYXNlIEhPU1ROQU1FOmlmKHQmJlwiZmlsZVwiPT1lLnNjaGVtZSl7dT1GSUxFX0hPU1Q7Y29udGludWV9aWYoXCI6XCIhPXN8fHkpe2lmKHM9PUVPRnx8XCIvXCI9PXN8fFwiP1wiPT1zfHxcIiNcIj09c3x8XCJcXFxcXCI9PXMmJmlzU3BlY2lhbChlKSl7aWYoaXNTcGVjaWFsKGUpJiZcIlwiPT1kKXJldHVybiBJTlZBTElEX0hPU1Q7aWYodCYmXCJcIj09ZCYmKGluY2x1ZGVzQ3JlZGVudGlhbHMoZSl8fG51bGwhPT1lLnBvcnQpKXJldHVybjtpZihsPXBhcnNlSG9zdChlLGQpKXJldHVybiBsO2lmKGQ9XCJcIix1PVBBVEhfU1RBUlQsdClyZXR1cm47Y29udGludWV9XCJbXCI9PXM/eT0hMDpcIl1cIj09cyYmKHk9ITEpLGQrPXN9ZWxzZXtpZihcIlwiPT1kKXJldHVybiBJTlZBTElEX0hPU1Q7aWYobD1wYXJzZUhvc3QoZSxkKSlyZXR1cm4gbDtpZihkPVwiXCIsdT1QT1JULHQ9PUhPU1ROQU1FKXJldHVybn1icmVhaztjYXNlIFBPUlQ6aWYoIURJR0lULnRlc3Qocykpe2lmKHM9PUVPRnx8XCIvXCI9PXN8fFwiP1wiPT1zfHxcIiNcIj09c3x8XCJcXFxcXCI9PXMmJmlzU3BlY2lhbChlKXx8dCl7aWYoXCJcIiE9ZCl7dmFyIG09cGFyc2VJbnQoZCwxMCk7aWYobT42NTUzNSlyZXR1cm4gSU5WQUxJRF9QT1JUO2UucG9ydD1pc1NwZWNpYWwoZSkmJm09PT1zcGVjaWFsU2NoZW1lc1tlLnNjaGVtZV0/bnVsbDptLGQ9XCJcIn1pZih0KXJldHVybjt1PVBBVEhfU1RBUlQ7Y29udGludWV9cmV0dXJuIElOVkFMSURfUE9SVH1kKz1zO2JyZWFrO2Nhc2UgRklMRTppZihlLnNjaGVtZT1cImZpbGVcIixcIi9cIj09c3x8XCJcXFxcXCI9PXMpdT1GSUxFX1NMQVNIO2Vsc2V7aWYoIWF8fFwiZmlsZVwiIT1hLnNjaGVtZSl7dT1QQVRIO2NvbnRpbnVlfWlmKHM9PUVPRillLmhvc3Q9YS5ob3N0LGUucGF0aD1hLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PWEucXVlcnk7ZWxzZSBpZihcIj9cIj09cyllLmhvc3Q9YS5ob3N0LGUucGF0aD1hLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PVwiXCIsdT1RVUVSWTtlbHNle2lmKFwiI1wiIT1zKXtzdGFydHNXaXRoV2luZG93c0RyaXZlTGV0dGVyKGkuc2xpY2UocCkuam9pbihcIlwiKSl8fChlLmhvc3Q9YS5ob3N0LGUucGF0aD1hLnBhdGguc2xpY2UoKSxzaG9ydGVuVVJMc1BhdGgoZSkpLHU9UEFUSDtjb250aW51ZX1lLmhvc3Q9YS5ob3N0LGUucGF0aD1hLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PWEucXVlcnksZS5mcmFnbWVudD1cIlwiLHU9RlJBR01FTlR9fWJyZWFrO2Nhc2UgRklMRV9TTEFTSDppZihcIi9cIj09c3x8XCJcXFxcXCI9PXMpe3U9RklMRV9IT1NUO2JyZWFrfWEmJlwiZmlsZVwiPT1hLnNjaGVtZSYmIXN0YXJ0c1dpdGhXaW5kb3dzRHJpdmVMZXR0ZXIoaS5zbGljZShwKS5qb2luKFwiXCIpKSYmKGlzV2luZG93c0RyaXZlTGV0dGVyKGEucGF0aFswXSwhMCk/ZS5wYXRoLnB1c2goYS5wYXRoWzBdKTplLmhvc3Q9YS5ob3N0KSx1PVBBVEg7Y29udGludWU7Y2FzZSBGSUxFX0hPU1Q6aWYocz09RU9GfHxcIi9cIj09c3x8XCJcXFxcXCI9PXN8fFwiP1wiPT1zfHxcIiNcIj09cyl7aWYoIXQmJmlzV2luZG93c0RyaXZlTGV0dGVyKGQpKXU9UEFUSDtlbHNlIGlmKFwiXCI9PWQpe2lmKGUuaG9zdD1cIlwiLHQpcmV0dXJuO3U9UEFUSF9TVEFSVH1lbHNle2lmKGw9cGFyc2VIb3N0KGUsZCkpcmV0dXJuIGw7aWYoXCJsb2NhbGhvc3RcIj09ZS5ob3N0JiYoZS5ob3N0PVwiXCIpLHQpcmV0dXJuO2Q9XCJcIix1PVBBVEhfU1RBUlR9Y29udGludWV9ZCs9czticmVhaztjYXNlIFBBVEhfU1RBUlQ6aWYoaXNTcGVjaWFsKGUpKXtpZih1PVBBVEgsXCIvXCIhPXMmJlwiXFxcXFwiIT1zKWNvbnRpbnVlfWVsc2UgaWYodHx8XCI/XCIhPXMpaWYodHx8XCIjXCIhPXMpe2lmKHMhPUVPRiYmKHU9UEFUSCxcIi9cIiE9cykpY29udGludWV9ZWxzZSBlLmZyYWdtZW50PVwiXCIsdT1GUkFHTUVOVDtlbHNlIGUucXVlcnk9XCJcIix1PVFVRVJZO2JyZWFrO2Nhc2UgUEFUSDppZihzPT1FT0Z8fFwiL1wiPT1zfHxcIlxcXFxcIj09cyYmaXNTcGVjaWFsKGUpfHwhdCYmKFwiP1wiPT1zfHxcIiNcIj09cykpe2lmKGlzRG91YmxlRG90KGQpPyhzaG9ydGVuVVJMc1BhdGgoZSksXCIvXCI9PXN8fFwiXFxcXFwiPT1zJiZpc1NwZWNpYWwoZSl8fGUucGF0aC5wdXNoKFwiXCIpKTppc1NpbmdsZURvdChkKT9cIi9cIj09c3x8XCJcXFxcXCI9PXMmJmlzU3BlY2lhbChlKXx8ZS5wYXRoLnB1c2goXCJcIik6KFwiZmlsZVwiPT1lLnNjaGVtZSYmIWUucGF0aC5sZW5ndGgmJmlzV2luZG93c0RyaXZlTGV0dGVyKGQpJiYoZS5ob3N0JiYoZS5ob3N0PVwiXCIpLGQ9ZC5jaGFyQXQoMCkrXCI6XCIpLGUucGF0aC5wdXNoKGQpKSxkPVwiXCIsXCJmaWxlXCI9PWUuc2NoZW1lJiYocz09RU9GfHxcIj9cIj09c3x8XCIjXCI9PXMpKWZvcig7ZS5wYXRoLmxlbmd0aD4xJiZcIlwiPT09ZS5wYXRoWzBdOyllLnBhdGguc2hpZnQoKTtcIj9cIj09cz8oZS5xdWVyeT1cIlwiLHU9UVVFUlkpOlwiI1wiPT1zJiYoZS5mcmFnbWVudD1cIlwiLHU9RlJBR01FTlQpfWVsc2UgZCs9cGVyY2VudEVuY29kZShzLHBhdGhQZXJjZW50RW5jb2RlU2V0KTticmVhaztjYXNlIENBTk5PVF9CRV9BX0JBU0VfVVJMX1BBVEg6XCI/XCI9PXM/KGUucXVlcnk9XCJcIix1PVFVRVJZKTpcIiNcIj09cz8oZS5mcmFnbWVudD1cIlwiLHU9RlJBR01FTlQpOnMhPUVPRiYmKGUucGF0aFswXSs9cGVyY2VudEVuY29kZShzLEMwQ29udHJvbFBlcmNlbnRFbmNvZGVTZXQpKTticmVhaztjYXNlIFFVRVJZOnR8fFwiI1wiIT1zP3MhPUVPRiYmKFwiJ1wiPT1zJiZpc1NwZWNpYWwoZSk/ZS5xdWVyeSs9XCIlMjdcIjplLnF1ZXJ5Kz1cIiNcIj09cz9cIiUyM1wiOnBlcmNlbnRFbmNvZGUocyxDMENvbnRyb2xQZXJjZW50RW5jb2RlU2V0KSk6KGUuZnJhZ21lbnQ9XCJcIix1PUZSQUdNRU5UKTticmVhaztjYXNlIEZSQUdNRU5UOnMhPUVPRiYmKGUuZnJhZ21lbnQrPXBlcmNlbnRFbmNvZGUocyxmcmFnbWVudFBlcmNlbnRFbmNvZGVTZXQpKX1wKyt9fSxVUkxDb25zdHJ1Y3Rvcj1mdW5jdGlvbiBVUkwoZSl7dmFyIHIsdCxhPWFuSW5zdGFuY2UodGhpcyxVUkxDb25zdHJ1Y3RvcixcIlVSTFwiKSxpPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLHM9dG9TdHJpbmcoZSksYz1zZXRJbnRlcm5hbFN0YXRlKGEse3R5cGU6XCJVUkxcIn0pO2lmKHZvaWQgMCE9PWkpaWYoaSBpbnN0YW5jZW9mIFVSTENvbnN0cnVjdG9yKXI9Z2V0SW50ZXJuYWxVUkxTdGF0ZShpKTtlbHNlIGlmKHQ9cGFyc2VVUkwocj17fSx0b1N0cmluZyhpKSkpdGhyb3cgVHlwZUVycm9yKHQpO2lmKHQ9cGFyc2VVUkwoYyxzLG51bGwscikpdGhyb3cgVHlwZUVycm9yKHQpO3ZhciBsPWMuc2VhcmNoUGFyYW1zPW5ldyBVUkxTZWFyY2hQYXJhbXMkMSx1PWdldEludGVybmFsU2VhcmNoUGFyYW1zU3RhdGUobCk7dS51cGRhdGVTZWFyY2hQYXJhbXMoYy5xdWVyeSksdS51cGRhdGVVUkw9ZnVuY3Rpb24oKXtjLnF1ZXJ5PVN0cmluZyhsKXx8bnVsbH0sZGVzY3JpcHRvcnN8fChhLmhyZWY9c2VyaWFsaXplVVJMLmNhbGwoYSksYS5vcmlnaW49Z2V0T3JpZ2luLmNhbGwoYSksYS5wcm90b2NvbD1nZXRQcm90b2NvbC5jYWxsKGEpLGEudXNlcm5hbWU9Z2V0VXNlcm5hbWUuY2FsbChhKSxhLnBhc3N3b3JkPWdldFBhc3N3b3JkLmNhbGwoYSksYS5ob3N0PWdldEhvc3QuY2FsbChhKSxhLmhvc3RuYW1lPWdldEhvc3RuYW1lLmNhbGwoYSksYS5wb3J0PWdldFBvcnQuY2FsbChhKSxhLnBhdGhuYW1lPWdldFBhdGhuYW1lLmNhbGwoYSksYS5zZWFyY2g9Z2V0U2VhcmNoLmNhbGwoYSksYS5zZWFyY2hQYXJhbXM9Z2V0U2VhcmNoUGFyYW1zLmNhbGwoYSksYS5oYXNoPWdldEhhc2guY2FsbChhKSl9LFVSTFByb3RvdHlwZT1VUkxDb25zdHJ1Y3Rvci5wcm90b3R5cGUsc2VyaWFsaXplVVJMPWZ1bmN0aW9uKCl7dmFyIGU9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKSxyPWUuc2NoZW1lLHQ9ZS51c2VybmFtZSxhPWUucGFzc3dvcmQsaT1lLmhvc3Qscz1lLnBvcnQsYz1lLnBhdGgsbD1lLnF1ZXJ5LHU9ZS5mcmFnbWVudCxwPXIrXCI6XCI7cmV0dXJuIG51bGwhPT1pPyhwKz1cIi8vXCIsaW5jbHVkZXNDcmVkZW50aWFscyhlKSYmKHArPXQrKGE/XCI6XCIrYTpcIlwiKStcIkBcIikscCs9c2VyaWFsaXplSG9zdChpKSxudWxsIT09cyYmKHArPVwiOlwiK3MpKTpcImZpbGVcIj09ciYmKHArPVwiLy9cIikscCs9ZS5jYW5ub3RCZUFCYXNlVVJMP2NbMF06Yy5sZW5ndGg/XCIvXCIrYy5qb2luKFwiL1wiKTpcIlwiLG51bGwhPT1sJiYocCs9XCI/XCIrbCksbnVsbCE9PXUmJihwKz1cIiNcIit1KSxwfSxnZXRPcmlnaW49ZnVuY3Rpb24oKXt2YXIgZT1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLHI9ZS5zY2hlbWUsdD1lLnBvcnQ7aWYoXCJibG9iXCI9PXIpdHJ5e3JldHVybiBuZXcgVVJMQ29uc3RydWN0b3Ioci5wYXRoWzBdKS5vcmlnaW59Y2F0Y2goZSl7cmV0dXJuXCJudWxsXCJ9cmV0dXJuXCJmaWxlXCIhPXImJmlzU3BlY2lhbChlKT9yK1wiOi8vXCIrc2VyaWFsaXplSG9zdChlLmhvc3QpKyhudWxsIT09dD9cIjpcIit0OlwiXCIpOlwibnVsbFwifSxnZXRQcm90b2NvbD1mdW5jdGlvbigpe3JldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNjaGVtZStcIjpcIn0sZ2V0VXNlcm5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS51c2VybmFtZX0sZ2V0UGFzc3dvcmQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5wYXNzd29yZH0sZ2V0SG9zdD1mdW5jdGlvbigpe3ZhciBlPWdldEludGVybmFsVVJMU3RhdGUodGhpcykscj1lLmhvc3QsdD1lLnBvcnQ7cmV0dXJuIG51bGw9PT1yP1wiXCI6bnVsbD09PXQ/c2VyaWFsaXplSG9zdChyKTpzZXJpYWxpemVIb3N0KHIpK1wiOlwiK3R9LGdldEhvc3RuYW1lPWZ1bmN0aW9uKCl7dmFyIGU9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5ob3N0O3JldHVybiBudWxsPT09ZT9cIlwiOnNlcmlhbGl6ZUhvc3QoZSl9LGdldFBvcnQ9ZnVuY3Rpb24oKXt2YXIgZT1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnBvcnQ7cmV0dXJuIG51bGw9PT1lP1wiXCI6U3RyaW5nKGUpfSxnZXRQYXRobmFtZT1mdW5jdGlvbigpe3ZhciBlPWdldEludGVybmFsVVJMU3RhdGUodGhpcykscj1lLnBhdGg7cmV0dXJuIGUuY2Fubm90QmVBQmFzZVVSTD9yWzBdOnIubGVuZ3RoP1wiL1wiK3Iuam9pbihcIi9cIik6XCJcIn0sZ2V0U2VhcmNoPWZ1bmN0aW9uKCl7dmFyIGU9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKS5xdWVyeTtyZXR1cm4gZT9cIj9cIitlOlwiXCJ9LGdldFNlYXJjaFBhcmFtcz1mdW5jdGlvbigpe3JldHVybiBnZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLnNlYXJjaFBhcmFtc30sZ2V0SGFzaD1mdW5jdGlvbigpe3ZhciBlPWdldEludGVybmFsVVJMU3RhdGUodGhpcykuZnJhZ21lbnQ7cmV0dXJuIGU/XCIjXCIrZTpcIlwifSxhY2Nlc3NvckRlc2NyaXB0b3I9ZnVuY3Rpb24oZSxyKXtyZXR1cm57Z2V0OmUsc2V0OnIsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fTtpZihkZXNjcmlwdG9ycyYmb2JqZWN0RGVmaW5lUHJvcGVydGllcyhVUkxQcm90b3R5cGUse2hyZWY6YWNjZXNzb3JEZXNjcmlwdG9yKHNlcmlhbGl6ZVVSTCwoZnVuY3Rpb24oZSl7dmFyIHI9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKSx0PXRvU3RyaW5nKGUpLGE9cGFyc2VVUkwocix0KTtpZihhKXRocm93IFR5cGVFcnJvcihhKTtnZXRJbnRlcm5hbFNlYXJjaFBhcmFtc1N0YXRlKHIuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXMoci5xdWVyeSl9KSksb3JpZ2luOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRPcmlnaW4pLHByb3RvY29sOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQcm90b2NvbCwoZnVuY3Rpb24oZSl7dmFyIHI9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtwYXJzZVVSTChyLHRvU3RyaW5nKGUpK1wiOlwiLFNDSEVNRV9TVEFSVCl9KSksdXNlcm5hbWU6YWNjZXNzb3JEZXNjcmlwdG9yKGdldFVzZXJuYW1lLChmdW5jdGlvbihlKXt2YXIgcj1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpLHQ9YXJyYXlGcm9tKHRvU3RyaW5nKGUpKTtpZighY2Fubm90SGF2ZVVzZXJuYW1lUGFzc3dvcmRQb3J0KHIpKXtyLnVzZXJuYW1lPVwiXCI7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspci51c2VybmFtZSs9cGVyY2VudEVuY29kZSh0W2FdLHVzZXJpbmZvUGVyY2VudEVuY29kZVNldCl9fSkpLHBhc3N3b3JkOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXNzd29yZCwoZnVuY3Rpb24oZSl7dmFyIHI9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKSx0PWFycmF5RnJvbSh0b1N0cmluZyhlKSk7aWYoIWNhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydChyKSl7ci5wYXNzd29yZD1cIlwiO2Zvcih2YXIgYT0wO2E8dC5sZW5ndGg7YSsrKXIucGFzc3dvcmQrPXBlcmNlbnRFbmNvZGUodFthXSx1c2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQpfX0pKSxob3N0OmFjY2Vzc29yRGVzY3JpcHRvcihnZXRIb3N0LChmdW5jdGlvbihlKXt2YXIgcj1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO3IuY2Fubm90QmVBQmFzZVVSTHx8cGFyc2VVUkwocix0b1N0cmluZyhlKSxIT1NUKX0pKSxob3N0bmFtZTphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0SG9zdG5hbWUsKGZ1bmN0aW9uKGUpe3ZhciByPWdldEludGVybmFsVVJMU3RhdGUodGhpcyk7ci5jYW5ub3RCZUFCYXNlVVJMfHxwYXJzZVVSTChyLHRvU3RyaW5nKGUpLEhPU1ROQU1FKX0pKSxwb3J0OmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQb3J0LChmdW5jdGlvbihlKXt2YXIgcj1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO2Nhbm5vdEhhdmVVc2VybmFtZVBhc3N3b3JkUG9ydChyKXx8KFwiXCI9PShlPXRvU3RyaW5nKGUpKT9yLnBvcnQ9bnVsbDpwYXJzZVVSTChyLGUsUE9SVCkpfSkpLHBhdGhuYW1lOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRQYXRobmFtZSwoZnVuY3Rpb24oZSl7dmFyIHI9Z2V0SW50ZXJuYWxVUkxTdGF0ZSh0aGlzKTtyLmNhbm5vdEJlQUJhc2VVUkx8fChyLnBhdGg9W10scGFyc2VVUkwocix0b1N0cmluZyhlKSxQQVRIX1NUQVJUKSl9KSksc2VhcmNoOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRTZWFyY2gsKGZ1bmN0aW9uKGUpe3ZhciByPWdldEludGVybmFsVVJMU3RhdGUodGhpcyk7XCJcIj09KGU9dG9TdHJpbmcoZSkpP3IucXVlcnk9bnVsbDooXCI/XCI9PWUuY2hhckF0KDApJiYoZT1lLnNsaWNlKDEpKSxyLnF1ZXJ5PVwiXCIscGFyc2VVUkwocixlLFFVRVJZKSksZ2V0SW50ZXJuYWxTZWFyY2hQYXJhbXNTdGF0ZShyLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHIucXVlcnkpfSkpLHNlYXJjaFBhcmFtczphY2Nlc3NvckRlc2NyaXB0b3IoZ2V0U2VhcmNoUGFyYW1zKSxoYXNoOmFjY2Vzc29yRGVzY3JpcHRvcihnZXRIYXNoLChmdW5jdGlvbihlKXt2YXIgcj1nZXRJbnRlcm5hbFVSTFN0YXRlKHRoaXMpO1wiXCIhPShlPXRvU3RyaW5nKGUpKT8oXCIjXCI9PWUuY2hhckF0KDApJiYoZT1lLnNsaWNlKDEpKSxyLmZyYWdtZW50PVwiXCIscGFyc2VVUkwocixlLEZSQUdNRU5UKSk6ci5mcmFnbWVudD1udWxsfSkpfSkscmVkZWZpbmUoVVJMUHJvdG90eXBlLFwidG9KU09OXCIsKGZ1bmN0aW9uIHRvSlNPTigpe3JldHVybiBzZXJpYWxpemVVUkwuY2FsbCh0aGlzKX0pLHtlbnVtZXJhYmxlOiEwfSkscmVkZWZpbmUoVVJMUHJvdG90eXBlLFwidG9TdHJpbmdcIiwoZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gc2VyaWFsaXplVVJMLmNhbGwodGhpcyl9KSx7ZW51bWVyYWJsZTohMH0pLE5hdGl2ZVVSTCl7dmFyIG5hdGl2ZUNyZWF0ZU9iamVjdFVSTD1OYXRpdmVVUkwuY3JlYXRlT2JqZWN0VVJMLG5hdGl2ZVJldm9rZU9iamVjdFVSTD1OYXRpdmVVUkwucmV2b2tlT2JqZWN0VVJMO25hdGl2ZUNyZWF0ZU9iamVjdFVSTCYmcmVkZWZpbmUoVVJMQ29uc3RydWN0b3IsXCJjcmVhdGVPYmplY3RVUkxcIiwoZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMKGUpe3JldHVybiBuYXRpdmVDcmVhdGVPYmplY3RVUkwuYXBwbHkoTmF0aXZlVVJMLGFyZ3VtZW50cyl9KSksbmF0aXZlUmV2b2tlT2JqZWN0VVJMJiZyZWRlZmluZShVUkxDb25zdHJ1Y3RvcixcInJldm9rZU9iamVjdFVSTFwiLChmdW5jdGlvbiByZXZva2VPYmplY3RVUkwoZSl7cmV0dXJuIG5hdGl2ZVJldm9rZU9iamVjdFVSTC5hcHBseShOYXRpdmVVUkwsYXJndW1lbnRzKX0pKX1zZXRUb1N0cmluZ1RhZyhVUkxDb25zdHJ1Y3RvcixcIlVSTFwiKSxfZXhwb3J0KHtnbG9iYWw6ITAsZm9yY2VkOiFuYXRpdmVVcmwsc2hhbTohZGVzY3JpcHRvcnN9LHtVUkw6VVJMQ29uc3RydWN0b3J9KTt2YXIgJGZvckVhY2g9YXJyYXlJdGVyYXRpb24uZm9yRWFjaCxTVFJJQ1RfTUVUSE9EPWFycmF5TWV0aG9kSXNTdHJpY3QoXCJmb3JFYWNoXCIpLGFycmF5Rm9yRWFjaD1TVFJJQ1RfTUVUSE9EP1tdLmZvckVhY2g6ZnVuY3Rpb24gZm9yRWFjaChlKXtyZXR1cm4gJGZvckVhY2godGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX0saGFuZGxlUHJvdG90eXBlPWZ1bmN0aW9uKGUpe2lmKGUmJmUuZm9yRWFjaCE9PWFycmF5Rm9yRWFjaCl0cnl7Y3JlYXRlTm9uRW51bWVyYWJsZVByb3BlcnR5KGUsXCJmb3JFYWNoXCIsYXJyYXlGb3JFYWNoKX1jYXRjaChyKXtlLmZvckVhY2g9YXJyYXlGb3JFYWNofX07Zm9yKHZhciBDT0xMRUNUSU9OX05BTUUgaW4gZG9tSXRlcmFibGVzKWhhbmRsZVByb3RvdHlwZShnbG9iYWwkMVtDT0xMRUNUSU9OX05BTUVdJiZnbG9iYWwkMVtDT0xMRUNUSU9OX05BTUVdLnByb3RvdHlwZSk7aGFuZGxlUHJvdG90eXBlKGRvbVRva2VuTGlzdFByb3RvdHlwZSk7dmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlPW9iamVjdFByb3BlcnR5SXNFbnVtZXJhYmxlLmYsY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihyKXtmb3IodmFyIHQsYT10b0luZGV4ZWRPYmplY3QociksaT1vYmplY3RLZXlzKGEpLHM9aS5sZW5ndGgsYz0wLGw9W107cz5jOyl0PWlbYysrXSxkZXNjcmlwdG9ycyYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoYSx0KXx8bC5wdXNoKGU/W3QsYVt0XV06YVt0XSk7cmV0dXJuIGx9fSxvYmplY3RUb0FycmF5PXtlbnRyaWVzOmNyZWF0ZU1ldGhvZCghMCksdmFsdWVzOmNyZWF0ZU1ldGhvZCghMSl9LCRlbnRyaWVzPW9iamVjdFRvQXJyYXkuZW50cmllcztfZXhwb3J0KHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwfSx7ZW50cmllczpmdW5jdGlvbiBlbnRyaWVzKGUpe3JldHVybiAkZW50cmllcyhlKX19KTt2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPW9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvci5mLCRzdGFydHNXaXRoPVwiXCIuc3RhcnRzV2l0aCxtaW4kMT1NYXRoLm1pbixDT1JSRUNUX0lTX1JFR0VYUF9MT0dJQz1jb3JyZWN0SXNSZWdleHBMb2dpYyhcInN0YXJ0c1dpdGhcIiksTUROX1BPTFlGSUxMX0JVRz0hKENPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDfHwoZGVzY3JpcHRvcj1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nLnByb3RvdHlwZSxcInN0YXJ0c1dpdGhcIiksIWRlc2NyaXB0b3J8fGRlc2NyaXB0b3Iud3JpdGFibGUpKSxkZXNjcmlwdG9yO19leHBvcnQoe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwLGZvcmNlZDohTUROX1BPTFlGSUxMX0JVRyYmIUNPUlJFQ1RfSVNfUkVHRVhQX0xPR0lDfSx7c3RhcnRzV2l0aDpmdW5jdGlvbiBzdGFydHNXaXRoKGUpe3ZhciByPXRvU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcykpO25vdEFSZWdleHAoZSk7dmFyIHQ9dG9MZW5ndGgobWluJDEoYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsci5sZW5ndGgpKSxhPXRvU3RyaW5nKGUpO3JldHVybiAkc3RhcnRzV2l0aD8kc3RhcnRzV2l0aC5jYWxsKHIsYSx0KTpyLnNsaWNlKHQsdCthLmxlbmd0aCk9PT1hfX0pO3ZhciBmbG9vcj1NYXRoLmZsb29yLHJlcGxhY2U9XCJcIi5yZXBsYWNlLFNVQlNUSVRVVElPTl9TWU1CT0xTPS9cXCQoWyQmJ2BdfFxcZHsxLDJ9fDxbXj5dKj4pL2csU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQ9L1xcJChbJCYnYF18XFxkezEsMn0pL2csZ2V0U3Vic3RpdHV0aW9uPWZ1bmN0aW9uKGUscix0LGEsaSxzKXt2YXIgYz10K2UubGVuZ3RoLGw9YS5sZW5ndGgsdT1TVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtyZXR1cm4gdm9pZCAwIT09aSYmKGk9dG9PYmplY3QoaSksdT1TVUJTVElUVVRJT05fU1lNQk9MUykscmVwbGFjZS5jYWxsKHMsdSwoZnVuY3Rpb24ocyx1KXt2YXIgcDtzd2l0Y2godS5jaGFyQXQoMCkpe2Nhc2VcIiRcIjpyZXR1cm5cIiRcIjtjYXNlXCImXCI6cmV0dXJuIGU7Y2FzZVwiYFwiOnJldHVybiByLnNsaWNlKDAsdCk7Y2FzZVwiJ1wiOnJldHVybiByLnNsaWNlKGMpO2Nhc2VcIjxcIjpwPWlbdS5zbGljZSgxLC0xKV07YnJlYWs7ZGVmYXVsdDp2YXIgZD0rdTtpZigwPT09ZClyZXR1cm4gcztpZihkPmwpe3ZhciBoPWZsb29yKGQvMTApO3JldHVybiAwPT09aD9zOmg8PWw/dm9pZCAwPT09YVtoLTFdP3UuY2hhckF0KDEpOmFbaC0xXSt1LmNoYXJBdCgxKTpzfXA9YVtkLTFdfXJldHVybiB2b2lkIDA9PT1wP1wiXCI6cH0pKX0sUkVQTEFDRT13ZWxsS25vd25TeW1ib2woXCJyZXBsYWNlXCIpLG1heD1NYXRoLm1heCxtaW49TWF0aC5taW4sbWF5YmVUb1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9lOlN0cmluZyhlKX0sUkVQTEFDRV9LRUVQU18kMD1cIiQwXCI9PT1cImFcIi5yZXBsYWNlKC8uLyxcIiQwXCIpLFJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFPSEhLy4vW1JFUExBQ0VdJiZcIlwiPT09Ly4vW1JFUExBQ0VdKFwiYVwiLFwiJDBcIiksUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFM9IWZhaWxzKChmdW5jdGlvbigpe3ZhciBlPS8uLztyZXR1cm4gZS5leGVjPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGUuZ3JvdXBzPXthOlwiN1wifSxlfSxcIjdcIiE9PVwiXCIucmVwbGFjZShlLFwiJDxhPlwiKX0pKTtmaXhSZWdleHBXZWxsS25vd25TeW1ib2xMb2dpYyhcInJlcGxhY2VcIiwoZnVuY3Rpb24oZSxyLHQpe3ZhciBhPVJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFP1wiJFwiOlwiJDBcIjtyZXR1cm5bZnVuY3Rpb24gcmVwbGFjZShlLHQpe3ZhciBhPXJlcXVpcmVPYmplY3RDb2VyY2libGUodGhpcyksaT1udWxsPT1lP3ZvaWQgMDpnZXRNZXRob2QoZSxSRVBMQUNFKTtyZXR1cm4gaT9pLmNhbGwoZSxhLHQpOnIuY2FsbCh0b1N0cmluZyhhKSxlLHQpfSxmdW5jdGlvbihlLGkpe3ZhciBzPWFuT2JqZWN0KHRoaXMpLGM9dG9TdHJpbmcoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkmJi0xPT09aS5pbmRleE9mKGEpJiYtMT09PWkuaW5kZXhPZihcIiQ8XCIpKXt2YXIgbD10KHIscyxjLGkpO2lmKGwuZG9uZSlyZXR1cm4gbC52YWx1ZX12YXIgdT1pc0NhbGxhYmxlKGkpO3V8fChpPXRvU3RyaW5nKGkpKTt2YXIgcD1zLmdsb2JhbDtpZihwKXt2YXIgZD1zLnVuaWNvZGU7cy5sYXN0SW5kZXg9MH1mb3IodmFyIGg9W107Oyl7dmFyIHk9cmVnZXhwRXhlY0Fic3RyYWN0KHMsYyk7aWYobnVsbD09PXkpYnJlYWs7aWYoaC5wdXNoKHkpLCFwKWJyZWFrO1wiXCI9PT10b1N0cmluZyh5WzBdKSYmKHMubGFzdEluZGV4PWFkdmFuY2VTdHJpbmdJbmRleChjLHRvTGVuZ3RoKHMubGFzdEluZGV4KSxkKSl9Zm9yKHZhciBBPVwiXCIsZz0wLHY9MDt2PGgubGVuZ3RoO3YrKyl7eT1oW3ZdO2Zvcih2YXIgRT10b1N0cmluZyh5WzBdKSxtPW1heChtaW4odG9JbnRlZ2VyKHkuaW5kZXgpLGMubGVuZ3RoKSwwKSxJPVtdLFA9MTtQPHkubGVuZ3RoO1ArKylJLnB1c2gobWF5YmVUb1N0cmluZyh5W1BdKSk7dmFyIGI9eS5ncm91cHM7aWYodSl7dmFyIFQ9W0VdLmNvbmNhdChJLG0sYyk7dm9pZCAwIT09YiYmVC5wdXNoKGIpO3ZhciBTPXRvU3RyaW5nKGkuYXBwbHkodm9pZCAwLFQpKX1lbHNlIFM9Z2V0U3Vic3RpdHV0aW9uKEUsYyxtLEksYixpKTttPj1nJiYoQSs9Yy5zbGljZShnLG0pK1MsZz1tK0UubGVuZ3RoKX1yZXR1cm4gQStjLnNsaWNlKGcpfV19KSwhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFN8fCFSRVBMQUNFX0tFRVBTXyQwfHxSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRSk7dmFyIElTX0NPTkNBVF9TUFJFQURBQkxFPXdlbGxLbm93blN5bWJvbChcImlzQ29uY2F0U3ByZWFkYWJsZVwiKSxNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEPVwiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkXCIsSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVD1lbmdpbmVWOFZlcnNpb24+PTUxfHwhZmFpbHMoKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIGVbSVNfQ09OQ0FUX1NQUkVBREFCTEVdPSExLGUuY29uY2F0KClbMF0hPT1lfSkpLFNQRUNJRVNfU1VQUE9SVD1hcnJheU1ldGhvZEhhc1NwZWNpZXNTdXBwb3J0KFwiY29uY2F0XCIpLGlzQ29uY2F0U3ByZWFkYWJsZT1mdW5jdGlvbihlKXtpZighaXNPYmplY3QoZSkpcmV0dXJuITE7dmFyIHI9ZVtJU19DT05DQVRfU1BSRUFEQUJMRV07cmV0dXJuIHZvaWQgMCE9PXI/ISFyOmlzQXJyYXkoZSl9LEZPUkNFRD0hSVNfQ09OQ0FUX1NQUkVBREFCTEVfU1VQUE9SVHx8IVNQRUNJRVNfU1VQUE9SVDtfZXhwb3J0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDpGT1JDRUR9LHtjb25jYXQ6ZnVuY3Rpb24gY29uY2F0KGUpe3ZhciByLHQsYSxpLHMsYz10b09iamVjdCh0aGlzKSxsPWFycmF5U3BlY2llc0NyZWF0ZShjLDApLHU9MDtmb3Iocj0tMSxhPWFyZ3VtZW50cy5sZW5ndGg7cjxhO3IrKylpZihpc0NvbmNhdFNwcmVhZGFibGUocz0tMT09PXI/Yzphcmd1bWVudHNbcl0pKXtpZih1KyhpPXRvTGVuZ3RoKHMubGVuZ3RoKSk+TUFYX1NBRkVfSU5URUdFUil0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtmb3IodD0wO3Q8aTt0KyssdSsrKXQgaW4gcyYmY3JlYXRlUHJvcGVydHkobCx1LHNbdF0pfWVsc2V7aWYodT49TUFYX1NBRkVfSU5URUdFUil0aHJvdyBUeXBlRXJyb3IoTUFYSU1VTV9BTExPV0VEX0lOREVYX0VYQ0VFREVEKTtjcmVhdGVQcm9wZXJ0eShsLHUrKyxzKX1yZXR1cm4gbC5sZW5ndGg9dSxsfX0pO3ZhciBjbnQ9MCxpbWFnZUNvbXByZXNzaW9uTGliVXJsLHdvcmtlcjtmdW5jdGlvbiBjcmVhdGVXb3JrZXIoZSl7dmFyIHI9W107cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZT9yLnB1c2goXCIoXCIuY29uY2F0KGUsXCIpKClcIikpOnIucHVzaChlKSxuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IocikpKX1mdW5jdGlvbiBjcmVhdGVTb3VyY2VPYmplY3QoZSl7cmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2VdLHt0eXBlOlwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwifSkpfWZ1bmN0aW9uIHN0cmluZ2lmeShlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoZnVuY3Rpb24oZSxyKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiByP1wiQklDX0ZOOjo6KGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwiLmNvbmNhdChyLnRvU3RyaW5nKCksXCIgfSkoKVwiKTpyfSkpfWZ1bmN0aW9uIHBhcnNlKG8pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBvKXJldHVybiBvO3ZhciByZXN1bHQ9e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKG8pLmZvckVhY2goKGZ1bmN0aW9uKF9yZWYpe3ZhciBfcmVmMj1fc2xpY2VkVG9BcnJheShfcmVmLDIpLGtleT1fcmVmMlswXSx2YWx1ZT1fcmVmMlsxXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdmFsdWUmJnZhbHVlLnN0YXJ0c1dpdGgoXCJCSUNfRk46OjpcIikpdHJ5e3Jlc3VsdFtrZXldPWV2YWwodmFsdWUucmVwbGFjZSgvXkJJQ19GTjo6Oi8sXCJcIikpfWNhdGNoKGUpe3Rocm93IGV9ZWxzZSByZXN1bHRba2V5XT1wYXJzZSh2YWx1ZSl9KSkscmVzdWx0fWZ1bmN0aW9uIGdlbmVyYXRlTGliKCl7cmV0dXJuIGNyZWF0ZVNvdXJjZU9iamVjdChcIlxcbiAgICAvLyByZWNvbnN0cnVjdCBsaWJyYXJ5XFxuICAgIGZ1bmN0aW9uIGltYWdlQ29tcHJlc3Npb24gKCl7cmV0dXJuIChcIi5jb25jYXQoaW1hZ2VDb21wcmVzc2lvbixcIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKX1cXG5cXG4gICAgaW1hZ2VDb21wcmVzc2lvbi5nZXREYXRhVXJsRnJvbUZpbGUgPSBcIikuY29uY2F0KGltYWdlQ29tcHJlc3Npb24uZ2V0RGF0YVVybEZyb21GaWxlLFwiXFxuICAgIGltYWdlQ29tcHJlc3Npb24uZ2V0RmlsZWZyb21EYXRhVXJsID0gXCIpLmNvbmNhdChpbWFnZUNvbXByZXNzaW9uLmdldEZpbGVmcm9tRGF0YVVybCxcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmxvYWRJbWFnZSA9IFwiKS5jb25jYXQoaW1hZ2VDb21wcmVzc2lvbi5sb2FkSW1hZ2UsXCJcXG4gICAgaW1hZ2VDb21wcmVzc2lvbi5kcmF3SW1hZ2VJbkNhbnZhcyA9IFwiKS5jb25jYXQoaW1hZ2VDb21wcmVzc2lvbi5kcmF3SW1hZ2VJbkNhbnZhcyxcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmRyYXdGaWxlSW5DYW52YXMgPSBcIikuY29uY2F0KGltYWdlQ29tcHJlc3Npb24uZHJhd0ZpbGVJbkNhbnZhcyxcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmNhbnZhc1RvRmlsZSA9IFwiKS5jb25jYXQoaW1hZ2VDb21wcmVzc2lvbi5jYW52YXNUb0ZpbGUsXCJcXG4gICAgaW1hZ2VDb21wcmVzc2lvbi5nZXRFeGlmT3JpZW50YXRpb24gPSBcIikuY29uY2F0KGltYWdlQ29tcHJlc3Npb24uZ2V0RXhpZk9yaWVudGF0aW9uLFwiXFxuICAgIGltYWdlQ29tcHJlc3Npb24uaGFuZGxlTWF4V2lkdGhPckhlaWdodCA9IFwiKS5jb25jYXQoaW1hZ2VDb21wcmVzc2lvbi5oYW5kbGVNYXhXaWR0aE9ySGVpZ2h0LFwiXFxuICAgIGltYWdlQ29tcHJlc3Npb24uZm9sbG93RXhpZk9yaWVudGF0aW9uID0gXCIpLmNvbmNhdChpbWFnZUNvbXByZXNzaW9uLmZvbGxvd0V4aWZPcmllbnRhdGlvbixcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmNsZWFudXBDYW52YXNNZW1vcnkgPSBcIikuY29uY2F0KGltYWdlQ29tcHJlc3Npb24uY2xlYW51cENhbnZhc01lbW9yeSxcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmlzQXV0b09yaWVudGF0aW9uSW5Ccm93c2VyID0gXCIpLmNvbmNhdChpbWFnZUNvbXByZXNzaW9uLmlzQXV0b09yaWVudGF0aW9uSW5Ccm93c2VyLFwiXFxuICAgIGltYWdlQ29tcHJlc3Npb24uYXBwcm94aW1hdGVCZWxvd01heGltdW1DYW52YXNTaXplT2ZCcm93c2VyID0gXCIpLmNvbmNhdChpbWFnZUNvbXByZXNzaW9uLmFwcHJveGltYXRlQmVsb3dNYXhpbXVtQ2FudmFzU2l6ZU9mQnJvd3NlcixcIlxcbiAgICBpbWFnZUNvbXByZXNzaW9uLmdldEJyb3dzZXJOYW1lID0gXCIpLmNvbmNhdChpbWFnZUNvbXByZXNzaW9uLmdldEJyb3dzZXJOYW1lLFwiXFxuXFxuICAgIC8vIGZ1bmN0aW9ucyAvIG9iamVjdHNcXG4gICAgZ2V0RGF0YVVybEZyb21GaWxlID0gaW1hZ2VDb21wcmVzc2lvbi5nZXREYXRhVXJsRnJvbUZpbGVcXG4gICAgZ2V0RmlsZWZyb21EYXRhVXJsID0gaW1hZ2VDb21wcmVzc2lvbi5nZXRGaWxlZnJvbURhdGFVcmxcXG4gICAgbG9hZEltYWdlID0gaW1hZ2VDb21wcmVzc2lvbi5sb2FkSW1hZ2VcXG4gICAgZHJhd0ltYWdlSW5DYW52YXMgPSBpbWFnZUNvbXByZXNzaW9uLmRyYXdJbWFnZUluQ2FudmFzXFxuICAgIGRyYXdGaWxlSW5DYW52YXMgPSBpbWFnZUNvbXByZXNzaW9uLmRyYXdGaWxlSW5DYW52YXNcXG4gICAgY2FudmFzVG9GaWxlID0gaW1hZ2VDb21wcmVzc2lvbi5jYW52YXNUb0ZpbGVcXG4gICAgZ2V0RXhpZk9yaWVudGF0aW9uID0gaW1hZ2VDb21wcmVzc2lvbi5nZXRFeGlmT3JpZW50YXRpb25cXG4gICAgaGFuZGxlTWF4V2lkdGhPckhlaWdodCA9IGltYWdlQ29tcHJlc3Npb24uaGFuZGxlTWF4V2lkdGhPckhlaWdodFxcbiAgICBmb2xsb3dFeGlmT3JpZW50YXRpb24gPSBpbWFnZUNvbXByZXNzaW9uLmZvbGxvd0V4aWZPcmllbnRhdGlvblxcbiAgICBjbGVhbnVwQ2FudmFzTWVtb3J5ID0gaW1hZ2VDb21wcmVzc2lvbi5jbGVhbnVwQ2FudmFzTWVtb3J5XFxuICAgIGlzQXV0b09yaWVudGF0aW9uSW5Ccm93c2VyID0gaW1hZ2VDb21wcmVzc2lvbi5pc0F1dG9PcmllbnRhdGlvbkluQnJvd3NlclxcbiAgICBhcHByb3hpbWF0ZUJlbG93TWF4aW11bUNhbnZhc1NpemVPZkJyb3dzZXIgPSBpbWFnZUNvbXByZXNzaW9uLmFwcHJveGltYXRlQmVsb3dNYXhpbXVtQ2FudmFzU2l6ZU9mQnJvd3NlclxcbiAgICBnZXRCcm93c2VyTmFtZSA9IGltYWdlQ29tcHJlc3Npb24uZ2V0QnJvd3Nlck5hbWVcXG4gICAgaXNJT1MgPSBcIikuY29uY2F0KGlzSU9TLFwiXFxuICAgIFxcbiAgICBnZXROZXdDYW52YXNBbmRDdHggPSBcIikuY29uY2F0KGdldE5ld0NhbnZhc0FuZEN0eCxcIlxcbiAgICBDdXN0b21GaWxlUmVhZGVyID0gRmlsZVJlYWRlclxcbiAgICBDdXN0b21GaWxlID0gRmlsZVxcbiAgICBNYXhDYW52YXNTaXplID0gXCIpLmNvbmNhdChKU09OLnN0cmluZ2lmeShNYXhDYW52YXNTaXplKSxcIlxcbiAgICBmdW5jdGlvbiBjb21wcmVzcyAoKXtyZXR1cm4gKFwiKS5jb25jYXQoY29tcHJlc3MsXCIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyl9XFxuXFxuICAgIC8vIGNvcmUtanNcXG4gICAgZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBuKSB7IHJldHVybiBhcnIgfVxcbiAgICBmdW5jdGlvbiBfdHlwZW9mKGEpIHsgcmV0dXJuIHR5cGVvZiBhIH1cXG4gICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XFxuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xcbiAgXFxuICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxcbiAgICAgIH1cXG4gIFxcbiAgICAgIHJldHVybiB0YXJnZXQ7XFxuICAgIH1cXG5cXG4gICAgLy8gTGlicmFyaWVzXFxuICAgIGNvbnN0IHBhcnNlID0gXCIpLmNvbmNhdChwYXJzZSxcIlxcbiAgICBjb25zdCBVUE5HID0ge31cXG4gICAgVVBORy50b1JHQkE4ID0gXCIpLmNvbmNhdChVUE5HLnRvUkdCQTgsXCJcXG4gICAgVVBORy50b1JHQkE4LmRlY29kZUltYWdlID0gXCIpLmNvbmNhdChVUE5HLnRvUkdCQTguZGVjb2RlSW1hZ2UsXCJcXG4gICAgVVBORy5kZWNvZGUgPSBcIikuY29uY2F0KFVQTkcuZGVjb2RlLFwiXFxuICAgIFVQTkcuZGVjb2RlLl9kZWNvbXByZXNzID0gXCIpLmNvbmNhdChVUE5HLmRlY29kZS5fZGVjb21wcmVzcyxcIlxcbiAgICBVUE5HLmRlY29kZS5faW5mbGF0ZSA9IFwiKS5jb25jYXQoVVBORy5kZWNvZGUuX2luZmxhdGUsXCJcXG4gICAgVVBORy5kZWNvZGUuX3JlYWRJbnRlcmxhY2UgPSBcIikuY29uY2F0KFVQTkcuZGVjb2RlLl9yZWFkSW50ZXJsYWNlLFwiXFxuICAgIFVQTkcuZGVjb2RlLl9nZXRCUFAgPSBcIikuY29uY2F0KFVQTkcuZGVjb2RlLl9nZXRCUFAsXCIgXFxuICAgIFVQTkcuZGVjb2RlLl9maWx0ZXJaZXJvID0gXCIpLmNvbmNhdChVUE5HLmRlY29kZS5fZmlsdGVyWmVybyxcIlxcbiAgICBVUE5HLmRlY29kZS5fcGFldGggPSBcIikuY29uY2F0KFVQTkcuZGVjb2RlLl9wYWV0aCxcIlxcbiAgICBVUE5HLmRlY29kZS5fSUhEUiA9IFwiKS5jb25jYXQoVVBORy5kZWNvZGUuX0lIRFIsXCJcXG4gICAgVVBORy5fYmluID0gcGFyc2UoXCIpLmNvbmNhdChzdHJpbmdpZnkoVVBORy5fYmluKSxcIilcXG4gICAgVVBORy5fY29weVRpbGUgPSBcIikuY29uY2F0KFVQTkcuX2NvcHlUaWxlLFwiXFxuICAgIFVQTkcuZW5jb2RlID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZSxcIlxcbiAgICBVUE5HLmVuY29kZUxMID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZUxMLFwiIFxcbiAgICBVUE5HLmVuY29kZS5fbWFpbiA9IFwiKS5jb25jYXQoVVBORy5lbmNvZGUuX21haW4sXCJcXG4gICAgVVBORy5lbmNvZGUuY29tcHJlc3NQTkcgPSBcIikuY29uY2F0KFVQTkcuZW5jb2RlLmNvbXByZXNzUE5HLFwiIFxcbiAgICBVUE5HLmVuY29kZS5jb21wcmVzcyA9IFwiKS5jb25jYXQoVVBORy5lbmNvZGUuY29tcHJlc3MsXCJcXG4gICAgVVBORy5lbmNvZGUuZnJhbWl6ZSA9IFwiKS5jb25jYXQoVVBORy5lbmNvZGUuZnJhbWl6ZSxcIiBcXG4gICAgVVBORy5lbmNvZGUuX3VwZGF0ZUZyYW1lID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZS5fdXBkYXRlRnJhbWUsXCIgXFxuICAgIFVQTkcuZW5jb2RlLl9wcmVwYXJlRGlmZiA9IFwiKS5jb25jYXQoVVBORy5lbmNvZGUuX3ByZXBhcmVEaWZmLFwiIFxcbiAgICBVUE5HLmVuY29kZS5fZmlsdGVyWmVybyA9IFwiKS5jb25jYXQoVVBORy5lbmNvZGUuX2ZpbHRlclplcm8sXCIgXFxuICAgIFVQTkcuZW5jb2RlLl9maWx0ZXJMaW5lID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZS5fZmlsdGVyTGluZSxcIlxcbiAgICBVUE5HLmVuY29kZS5jb25jYXRSR0JBID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZS5jb25jYXRSR0JBLFwiXFxuICAgIFVQTkcuY3JjID0gcGFyc2UoXCIpLmNvbmNhdChzdHJpbmdpZnkoVVBORy5jcmMpLFwiKVxcbiAgICBVUE5HLmNyYy50YWJsZSA9ICggZnVuY3Rpb24oKSB7XFxuICAgIHZhciB0YWIgPSBuZXcgVWludDMyQXJyYXkoMjU2KTtcXG4gICAgZm9yICh2YXIgbj0wOyBuPDI1NjsgbisrKSB7XFxuICAgICAgdmFyIGMgPSBuO1xcbiAgICAgIGZvciAodmFyIGs9MDsgazw4OyBrKyspIHtcXG4gICAgICAgIGlmIChjICYgMSkgIGMgPSAweGVkYjg4MzIwIF4gKGMgPj4+IDEpO1xcbiAgICAgICAgZWxzZSAgICAgICAgYyA9IGMgPj4+IDE7XFxuICAgICAgfVxcbiAgICAgIHRhYltuXSA9IGM7ICB9XFxuICAgIHJldHVybiB0YWI7ICB9KSgpXFxuICAgIFVQTkcucXVhbnRpemUgPSBcIikuY29uY2F0KFVQTkcucXVhbnRpemUsXCIgXFxuICAgIFVQTkcucXVhbnRpemUuZ2V0S0R0cmVlID0gXCIpLmNvbmNhdChVUE5HLnF1YW50aXplLmdldEtEdHJlZSxcIiBcXG4gICAgVVBORy5xdWFudGl6ZS5nZXROZWFyZXN0ID0gXCIpLmNvbmNhdChVUE5HLnF1YW50aXplLmdldE5lYXJlc3QsXCIgXFxuICAgIFVQTkcucXVhbnRpemUucGxhbmVEc3QgPSBcIikuY29uY2F0KFVQTkcucXVhbnRpemUucGxhbmVEc3QsXCIgXFxuICAgIFVQTkcucXVhbnRpemUuZGlzdCA9IFwiKS5jb25jYXQoVVBORy5xdWFudGl6ZS5kaXN0LFwiICAgICBcXG4gICAgVVBORy5xdWFudGl6ZS5zcGxpdFBpeGVscyA9IFwiKS5jb25jYXQoVVBORy5xdWFudGl6ZS5zcGxpdFBpeGVscyxcIiBcXG4gICAgVVBORy5xdWFudGl6ZS52ZWNEb3QgPSBcIikuY29uY2F0KFVQTkcucXVhbnRpemUudmVjRG90LFwiIFxcbiAgICBVUE5HLnF1YW50aXplLnN0YXRzID0gXCIpLmNvbmNhdChVUE5HLnF1YW50aXplLnN0YXRzLFwiIFxcbiAgICBVUE5HLnF1YW50aXplLmVzdGF0cyA9IFwiKS5jb25jYXQoVVBORy5xdWFudGl6ZS5lc3RhdHMsXCJcXG4gICAgVVBORy5NNCA9IHBhcnNlKFwiKS5jb25jYXQoc3RyaW5naWZ5KFVQTkcuTTQpLFwiKVxcbiAgICBVUE5HLmVuY29kZS5jb25jYXRSR0JBID0gXCIpLmNvbmNhdChVUE5HLmVuY29kZS5jb25jYXRSR0JBLCdcXG4gICAgVVBORy5pbmZsYXRlUmF3PWZ1bmN0aW9uKCl7XFxuICAgIHZhciBIPXt9O0guSD17fTtILkguTj1mdW5jdGlvbihOLFcpe3ZhciBSPVVpbnQ4QXJyYXksaT0wLG09MCxKPTAsaD0wLFE9MCxYPTAsdT0wLHc9MCxkPTAsdixDO1xcbiAgICAgIGlmKE5bMF09PTMmJk5bMV09PTApcmV0dXJuIFc/VzpuZXcgUigwKTt2YXIgVj1ILkgsbj1WLmIsQT1WLmUsbD1WLlIsTT1WLm4sST1WLkEsZT1WLlosYj1WLm0sWj1XPT1udWxsO1xcbiAgICAgIGlmKFopVz1uZXcgUihOLmxlbmd0aD4+PjI8PDUpO3doaWxlKGk9PTApe2k9bihOLGQsMSk7bT1uKE4sZCsxLDIpO2QrPTM7aWYobT09MCl7aWYoKGQmNykhPTApZCs9OC0oZCY3KTtcXG4gICAgICAgIHZhciBEPShkPj4+MykrNCxxPU5bRC00XXxOW0QtM108PDg7aWYoWilXPUguSC5XKFcsdytxKTtXLnNldChuZXcgUihOLmJ1ZmZlcixOLmJ5dGVPZmZzZXQrRCxxKSx3KTtkPUQrcTw8MztcXG4gICAgICAgIHcrPXE7Y29udGludWV9aWYoWilXPUguSC5XKFcsdysoMTw8MTcpKTtpZihtPT0xKXt2PWIuSjtDPWIuaDtYPSgxPDw5KS0xO3U9KDE8PDUpLTF9aWYobT09Mil7Sj1BKE4sZCw1KSsyNTc7XFxuICAgICAgICBoPUEoTixkKzUsNSkrMTtRPUEoTixkKzEwLDQpKzQ7ZCs9MTQ7dmFyIEU9ZCxqPTE7Zm9yKHZhciBjPTA7YzwzODtjKz0yKXtiLlFbY109MDtiLlFbYysxXT0wfWZvcih2YXIgYz0wO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzxRO2MrKyl7dmFyIEs9QShOLGQrYyozLDMpO2IuUVsoYi5YW2NdPDwxKSsxXT1LO2lmKEs+ailqPUt9ZCs9MypRO00oYi5RLGopO0koYi5RLGosYi51KTt2PWIudztDPWIuZDtcXG4gICAgICAgIGQ9bChiLnUsKDE8PGopLTEsSitoLE4sZCxiLnYpO3ZhciByPVYuVihiLnYsMCxKLGIuQyk7WD0oMTw8ciktMTt2YXIgUz1WLlYoYi52LEosaCxiLkQpO3U9KDE8PFMpLTE7TShiLkMscik7XFxuICAgICAgICBJKGIuQyxyLHYpO00oYi5ELFMpO0koYi5ELFMsQyl9d2hpbGUoITApe3ZhciBUPXZbZShOLGQpJlhdO2QrPVQmMTU7dmFyIHA9VD4+PjQ7aWYocD4+Pjg9PTApe1dbdysrXT1wfWVsc2UgaWYocD09MjU2KXticmVha31lbHNle3ZhciB6PXcrcC0yNTQ7XFxuICAgICAgICBpZihwPjI2NCl7dmFyIF89Yi5xW3AtMjU3XTt6PXcrKF8+Pj4zKStBKE4sZCxfJjcpO2QrPV8mN312YXIgJD1DW2UoTixkKSZ1XTtkKz0kJjE1O3ZhciBzPSQ+Pj40LFk9Yi5jW3NdLGE9KFk+Pj40KStuKE4sZCxZJjE1KTtcXG4gICAgICAgIGQrPVkmMTU7d2hpbGUodzx6KXtXW3ddPVdbdysrLWFdO1dbd109V1t3KystYV07V1t3XT1XW3crKy1hXTtXW3ddPVdbdysrLWFdfXc9en19fXJldHVybiBXLmxlbmd0aD09dz9XOlcuc2xpY2UoMCx3KX07XFxuICAgICAgSC5ILlc9ZnVuY3Rpb24oTixXKXt2YXIgUj1OLmxlbmd0aDtpZihXPD1SKXJldHVybiBOO3ZhciBWPW5ldyBVaW50OEFycmF5KFI8PDEpO1Yuc2V0KE4sMCk7cmV0dXJuIFZ9O1xcbiAgICAgIEguSC5SPWZ1bmN0aW9uKE4sVyxSLFYsbixBKXt2YXIgbD1ILkguZSxNPUguSC5aLEk9MDt3aGlsZShJPFIpe3ZhciBlPU5bTShWLG4pJlddO24rPWUmMTU7dmFyIGI9ZT4+PjQ7XFxuICAgICAgICBpZihiPD0xNSl7QVtJXT1iO0krK31lbHNle3ZhciBaPTAsbT0wO2lmKGI9PTE2KXttPTMrbChWLG4sMik7bis9MjtaPUFbSS0xXX1lbHNlIGlmKGI9PTE3KXttPTMrbChWLG4sMyk7XFxuICAgICAgICAgIG4rPTN9ZWxzZSBpZihiPT0xOCl7bT0xMStsKFYsbiw3KTtuKz03fXZhciBKPUkrbTt3aGlsZShJPEope0FbSV09WjtJKyt9fX1yZXR1cm4gbn07SC5ILlY9ZnVuY3Rpb24oTixXLFIsVil7dmFyIG49MCxBPTAsbD1WLmxlbmd0aD4+PjE7XFxuICAgICAgICB3aGlsZShBPFIpe3ZhciBNPU5bQStXXTtWW0E8PDFdPTA7VlsoQTw8MSkrMV09TTtpZihNPm4pbj1NO0ErK313aGlsZShBPGwpe1ZbQTw8MV09MDtWWyhBPDwxKSsxXT0wO0ErK31yZXR1cm4gbn07XFxuICAgICAgSC5ILm49ZnVuY3Rpb24oTixXKXt2YXIgUj1ILkgubSxWPU4ubGVuZ3RoLG4sQSxsLE0sSSxlPVIuajtmb3IodmFyIE09MDtNPD1XO00rKyllW01dPTA7Zm9yKE09MTtNPFY7TSs9MillW05bTV1dKys7XFxuICAgICAgICB2YXIgYj1SLks7bj0wO2VbMF09MDtmb3IoQT0xO0E8PVc7QSsrKXtuPW4rZVtBLTFdPDwxO2JbQV09bn1mb3IobD0wO2w8VjtsKz0yKXtJPU5bbCsxXTtpZihJIT0wKXtOW2xdPWJbSV07XFxuICAgICAgICAgIGJbSV0rK319fTtILkguQT1mdW5jdGlvbihOLFcsUil7dmFyIFY9Ti5sZW5ndGgsbj1ILkgubSxBPW4ucjtmb3IodmFyIGw9MDtsPFY7bCs9MilpZihOW2wrMV0hPTApe3ZhciBNPWw+PjEsST1OW2wrMV0sZT1NPDw0fEksYj1XLUksWj1OW2xdPDxiLG09WisoMTw8Yik7XFxuICAgICAgICB3aGlsZShaIT1tKXt2YXIgSj1BW1pdPj4+MTUtVztSW0pdPWU7WisrfX19O0guSC5sPWZ1bmN0aW9uKE4sVyl7dmFyIFI9SC5ILm0ucixWPTE1LVc7Zm9yKHZhciBuPTA7bjxOLmxlbmd0aDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbis9Mil7dmFyIEE9TltuXTw8Vy1OW24rMV07TltuXT1SW0FdPj4+Vn19O0guSC5NPWZ1bmN0aW9uKE4sVyxSKXtSPVI8PChXJjcpO3ZhciBWPVc+Pj4zO05bVl18PVI7TltWKzFdfD1SPj4+OH07XFxuICAgICAgSC5ILkk9ZnVuY3Rpb24oTixXLFIpe1I9Ujw8KFcmNyk7dmFyIFY9Vz4+PjM7TltWXXw9UjtOW1YrMV18PVI+Pj44O05bVisyXXw9Uj4+PjE2fTtILkguZT1mdW5jdGlvbihOLFcsUil7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OCk+Pj4oVyY3KSYoMTw8UiktMX07XFxuICAgICAgSC5ILmI9ZnVuY3Rpb24oTixXLFIpe3JldHVybihOW1c+Pj4zXXxOWyhXPj4+MykrMV08PDh8TlsoVz4+PjMpKzJdPDwxNik+Pj4oVyY3KSYoMTw8UiktMX07SC5ILlo9ZnVuY3Rpb24oTixXKXtyZXR1cm4oTltXPj4+M118TlsoVz4+PjMpKzFdPDw4fE5bKFc+Pj4zKSsyXTw8MTYpPj4+KFcmNyl9O1xcbiAgICAgIEguSC5pPWZ1bmN0aW9uKE4sVyl7cmV0dXJuKE5bVz4+PjNdfE5bKFc+Pj4zKSsxXTw8OHxOWyhXPj4+MykrMl08PDE2fE5bKFc+Pj4zKSszXTw8MjQpPj4+KFcmNyl9O0guSC5tPWZ1bmN0aW9uKCl7dmFyIE49VWludDE2QXJyYXksVz1VaW50MzJBcnJheTtcXG4gICAgICAgIHJldHVybntLOm5ldyBOKDE2KSxqOm5ldyBOKDE2KSxYOlsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSxTOlszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDk5OSw5OTksOTk5XSxUOlswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdLHE6bmV3IE4oMzIpLHA6WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3Nyw2NTUzNSw2NTUzNV0sejpbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdLGM6bmV3IFcoMzIpLEo6bmV3IE4oNTEyKSxfOltdLGg6bmV3IE4oMzIpLCQ6W10sdzpuZXcgTigzMjc2OCksQzpbXSx2OltdLGQ6bmV3IE4oMzI3NjgpLEQ6W10sdTpuZXcgTig1MTIpLFE6W10scjpuZXcgTigxPDwxNSksczpuZXcgVygyODYpLFk6bmV3IFcoMzApLGE6bmV3IFcoMTkpLHQ6bmV3IFcoMTVlMyksazpuZXcgTigxPDwxNiksZzpuZXcgTigxPDwxNSl9fSgpO1xcbiAgICAgIChmdW5jdGlvbigpe3ZhciBOPUguSC5tLFc9MTw8MTU7Zm9yKHZhciBSPTA7UjxXO1IrKyl7dmFyIFY9UjtWPShWJjI4NjMzMTE1MzApPj4+MXwoViYxNDMxNjU1NzY1KTw8MTtcXG4gICAgICAgIFY9KFYmMzQzNTk3MzgzNik+Pj4yfChWJjg1ODk5MzQ1OSk8PDI7Vj0oViY0MDQyMzIyMTYwKT4+PjR8KFYmMjUyNjQ1MTM1KTw8NDtWPShWJjQyNzgyNTUzNjApPj4+OHwoViYxNjcxMTkzNSk8PDg7XFxuICAgICAgICBOLnJbUl09KFY+Pj4xNnxWPDwxNik+Pj4xN31mdW5jdGlvbiBuKEEsbCxNKXt3aGlsZShsLS0hPTApQS5wdXNoKDAsTSl9Zm9yKHZhciBSPTA7UjwzMjtSKyspe04ucVtSXT1OLlNbUl08PDN8Ti5UW1JdO1xcbiAgICAgICAgTi5jW1JdPU4ucFtSXTw8NHxOLnpbUl19bihOLl8sMTQ0LDgpO24oTi5fLDI1NS0xNDMsOSk7bihOLl8sMjc5LTI1NSw3KTtuKE4uXywyODctMjc5LDgpO0guSC5uKE4uXyw5KTtcXG4gICAgICAgIEguSC5BKE4uXyw5LE4uSik7SC5ILmwoTi5fLDkpO24oTi4kLDMyLDUpO0guSC5uKE4uJCw1KTtILkguQShOLiQsNSxOLmgpO0guSC5sKE4uJCw1KTtuKE4uUSwxOSwwKTtuKE4uQywyODYsMCk7XFxuICAgICAgICBuKE4uRCwzMCwwKTtuKE4udiwzMjAsMCl9KCkpO3JldHVybiBILkguTn0oKVxcbiAgICBcXG4gICAgY29uc3QgVVpJUCA9IHt9XFxuICAgIFVaSVBbXCJwYXJzZVwiXSA9ICcpLmNvbmNhdChVWklQXzEucGFyc2UsXCJcXG4gICAgVVpJUC5fcmVhZExvY2FsID0gXCIpLmNvbmNhdChVWklQXzEuX3JlYWRMb2NhbCxcIlxcbiAgICBVWklQLmluZmxhdGVSYXcgPSBcIikuY29uY2F0KFVaSVBfMS5pbmZsYXRlUmF3LFwiXFxuICAgIFVaSVAuaW5mbGF0ZSA9IFwiKS5jb25jYXQoVVpJUF8xLmluZmxhdGUsXCJcXG4gICAgVVpJUC5kZWZsYXRlID0gXCIpLmNvbmNhdChVWklQXzEuZGVmbGF0ZSxcIlxcbiAgICBVWklQLmRlZmxhdGVSYXcgPSBcIikuY29uY2F0KFVaSVBfMS5kZWZsYXRlUmF3LFwiXFxuICAgIFVaSVAuZW5jb2RlID0gXCIpLmNvbmNhdChVWklQXzEuZW5jb2RlLFwiXFxuICAgIFVaSVAuX25vTmVlZCA9IFwiKS5jb25jYXQoVVpJUF8xLl9ub05lZWQsXCJcXG4gICAgVVpJUC5fd3JpdGVIZWFkZXIgPSBcIikuY29uY2F0KFVaSVBfMS5fd3JpdGVIZWFkZXIsXCJcXG4gICAgVVpJUC5jcmMgPSBwYXJzZShcIikuY29uY2F0KHN0cmluZ2lmeShVWklQXzEuY3JjKSxcIilcXG4gICAgVVpJUC5jcmMudGFibGUgPSAoIGZ1bmN0aW9uKCkge1xcbiAgICAgIHZhciB0YWIgPSBuZXcgVWludDMyQXJyYXkoMjU2KTtcXG4gICAgICBmb3IgKHZhciBuPTA7IG48MjU2OyBuKyspIHtcXG4gICAgICAgIHZhciBjID0gbjtcXG4gICAgICAgIGZvciAodmFyIGs9MDsgazw4OyBrKyspIHtcXG4gICAgICAgICAgaWYgKGMgJiAxKSAgYyA9IDB4ZWRiODgzMjAgXiAoYyA+Pj4gMSk7XFxuICAgICAgICAgIGVsc2UgICAgICAgIGMgPSBjID4+PiAxO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGFiW25dID0gYzsgIH1cXG4gICAgICByZXR1cm4gdGFiOyAgfSkoKVxcbiAgICBcXG4gICAgVVpJUC5hZGxlciA9IFwiKS5jb25jYXQoVVpJUF8xLmFkbGVyLFwiXFxuICAgIFVaSVAuYmluID0gcGFyc2UoXCIpLmNvbmNhdChzdHJpbmdpZnkoVVpJUF8xLmJpbiksXCIpXFxuICAgIFVaSVAuRiA9IHt9XFxuICAgIFVaSVAuRi5kZWZsYXRlUmF3ID0gXCIpLmNvbmNhdChVWklQXzEuRi5kZWZsYXRlUmF3LFwiXFxuICAgIFVaSVAuRi5fYmVzdE1hdGNoID0gXCIpLmNvbmNhdChVWklQXzEuRi5fYmVzdE1hdGNoLFwiXFxuICAgIFVaSVAuRi5faG93TG9uZyA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2hvd0xvbmcsXCJcXG4gICAgVVpJUC5GLl9oYXNoID0gXCIpLmNvbmNhdChVWklQXzEuRi5faGFzaCxcIlxcbiAgICBVWklQLnNhdmVkID0gXCIpLmNvbmNhdChVWklQXzEuc2F2ZWQsXCJcXG4gICAgVVpJUC5GLl93cml0ZUJsb2NrID0gXCIpLmNvbmNhdChVWklQXzEuRi5fd3JpdGVCbG9jayxcIlxcbiAgICBVWklQLkYuX2NvcHlFeGFjdCA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2NvcHlFeGFjdCxcIlxcbiAgICBVWklQLkYuZ2V0VHJlZXMgPSBcIikuY29uY2F0KFVaSVBfMS5GLmdldFRyZWVzLFwiXFxuICAgIFVaSVAuRi5nZXRTZWNvbmQgPSBcIikuY29uY2F0KFVaSVBfMS5GLmdldFNlY29uZCxcIlxcbiAgICBVWklQLkYubm9uWmVybyA9IFwiKS5jb25jYXQoVVpJUF8xLkYubm9uWmVybyxcIlxcbiAgICBVWklQLkYuY29udFNpemUgPSBcIikuY29uY2F0KFVaSVBfMS5GLmNvbnRTaXplLFwiXFxuICAgIFVaSVAuRi5fY29kZVRpbnkgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9jb2RlVGlueSxcIiBcXG4gICAgVVpJUC5GLl9sZW5Db2RlcyA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2xlbkNvZGVzLFwiIFxcbiAgICBVWklQLkYuX2h1ZlRyZWUgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9odWZUcmVlLFwiIFxcbiAgICBVWklQLkYuc2V0RGVwdGggPSBcIikuY29uY2F0KFVaSVBfMS5GLnNldERlcHRoLFwiIFxcbiAgICBVWklQLkYucmVzdHJpY3REZXB0aCA9IFwiKS5jb25jYXQoVVpJUF8xLkYucmVzdHJpY3REZXB0aCxcIlxcbiAgICBVWklQLkYuX2dvb2RJbmRleCA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2dvb2RJbmRleCxcIiBcXG4gICAgVVpJUC5GLl93cml0ZUxpdCA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX3dyaXRlTGl0LFwiIFxcbiAgICBVWklQLkYuaW5mbGF0ZSA9IFwiKS5jb25jYXQoVVpJUF8xLkYuaW5mbGF0ZSxcIiBcXG4gICAgVVpJUC5GLl9jaGVjayA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2NoZWNrLFwiIFxcbiAgICBVWklQLkYuX2RlY29kZVRpbnkgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9kZWNvZGVUaW55LFwiIFxcbiAgICBVWklQLkYuX2NvcHlPdXQgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9jb3B5T3V0LFwiIFxcbiAgICBVWklQLkYubWFrZUNvZGVzID0gXCIpLmNvbmNhdChVWklQXzEuRi5tYWtlQ29kZXMsXCIgXFxuICAgIFVaSVAuRi5jb2RlczJtYXAgPSBcIikuY29uY2F0KFVaSVBfMS5GLmNvZGVzMm1hcCxcIiBcXG4gICAgVVpJUC5GLnJldkNvZGVzID0gXCIpLmNvbmNhdChVWklQXzEuRi5yZXZDb2RlcyxcIiBcXG5cXG4gICAgLy8gdXNlZCBvbmx5IGluIGRlZmxhdGVcXG4gICAgVVpJUC5GLl9wdXRzRSA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX3B1dHNFLFwiXFxuICAgIFVaSVAuRi5fcHV0c0YgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9wdXRzRixcIlxcbiAgXFxuICAgIFVaSVAuRi5fYml0c0UgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9iaXRzRSxcIlxcbiAgICBVWklQLkYuX2JpdHNGID0gXCIpLmNvbmNhdChVWklQXzEuRi5fYml0c0YsXCJcXG5cXG4gICAgVVpJUC5GLl9nZXQxNyA9IFwiKS5jb25jYXQoVVpJUF8xLkYuX2dldDE3LFwiXFxuICAgIFVaSVAuRi5fZ2V0MjUgPSBcIikuY29uY2F0KFVaSVBfMS5GLl9nZXQyNSxcIlxcbiAgICBVWklQLkYuVSA9IGZ1bmN0aW9uKCl7XFxuICAgICAgdmFyIHUxNj1VaW50MTZBcnJheSwgdTMyPVVpbnQzMkFycmF5O1xcbiAgICAgIHJldHVybiB7XFxuICAgICAgICBuZXh0X2NvZGUgOiBuZXcgdTE2KDE2KSxcXG4gICAgICAgIGJsX2NvdW50ICA6IG5ldyB1MTYoMTYpLFxcbiAgICAgICAgb3JkciA6IFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdLFxcbiAgICAgICAgb2YwICA6IFszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDk5OSw5OTksOTk5XSxcXG4gICAgICAgIGV4YiAgOiBbMCwwLDAsMCwwLDAsMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgMCwgIDAsICAwLCAgMF0sXFxuICAgICAgICBsZGVmIDogbmV3IHUxNigzMiksXFxuICAgICAgICBkZjAgIDogWzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3NywgNjU1MzUsIDY1NTM1XSxcXG4gICAgICAgIGR4YiAgOiBbMCwwLDAsMCwxLDEsMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgICA5LCAgIDksICAxMCwgIDEwLCAgMTEsICAxMSwgIDEyLCAgIDEyLCAgIDEzLCAgIDEzLCAgICAgMCwgICAgIDBdLFxcbiAgICAgICAgZGRlZiA6IG5ldyB1MzIoMzIpLFxcbiAgICAgICAgZmxtYXA6IG5ldyB1MTYoICA1MTIpLCAgZmx0cmVlOiBbXSxcXG4gICAgICAgIGZkbWFwOiBuZXcgdTE2KCAgIDMyKSwgIGZkdHJlZTogW10sXFxuICAgICAgICBsbWFwIDogbmV3IHUxNigzMjc2OCksICBsdHJlZSA6IFtdLCAgdHRyZWU6W10sXFxuICAgICAgICBkbWFwIDogbmV3IHUxNigzMjc2OCksICBkdHJlZSA6IFtdLFxcbiAgICAgICAgaW1hcCA6IG5ldyB1MTYoICA1MTIpLCAgaXRyZWUgOiBbXSxcXG4gICAgICAgIC8vcmV2OSA6IG5ldyB1MTYoICA1MTIpXFxuICAgICAgICByZXYxNTogbmV3IHUxNigxPDwxNSksXFxuICAgICAgICBsaHN0IDogbmV3IHUzMigyODYpLCBkaHN0IDogbmV3IHUzMiggMzApLCBpaHN0IDogbmV3IHUzMigxOSksXFxuICAgICAgICBsaXRzIDogbmV3IHUzMigxNTAwMCksXFxuICAgICAgICBzdHJ0IDogbmV3IHUxNigxPDwxNiksXFxuICAgICAgICBwcmV2IDogbmV3IHUxNigxPDwxNSlcXG4gICAgICB9O1xcbiAgICB9ICgpO1xcblxcbiAgICAoZnVuY3Rpb24oKXtcXG4gICAgICB2YXIgVSA9IFVaSVAuRi5VO1xcbiAgICAgIHZhciBsZW4gPSAxPDwxNTtcXG4gICAgICBmb3IodmFyIGk9MDsgaTxsZW47IGkrKykge1xcbiAgICAgICAgdmFyIHggPSBpO1xcbiAgICAgICAgeCA9ICgoKHggJiAweGFhYWFhYWFhKSA+Pj4gMSkgfCAoKHggJiAweDU1NTU1NTU1KSA8PCAxKSk7XFxuICAgICAgICB4ID0gKCgoeCAmIDB4Y2NjY2NjY2MpID4+PiAyKSB8ICgoeCAmIDB4MzMzMzMzMzMpIDw8IDIpKTtcXG4gICAgICAgIHggPSAoKCh4ICYgMHhmMGYwZjBmMCkgPj4+IDQpIHwgKCh4ICYgMHgwZjBmMGYwZikgPDwgNCkpO1xcbiAgICAgICAgeCA9ICgoKHggJiAweGZmMDBmZjAwKSA+Pj4gOCkgfCAoKHggJiAweDAwZmYwMGZmKSA8PCA4KSk7XFxuICAgICAgICBVLnJldjE1W2ldID0gKCgoeCA+Pj4gMTYpIHwgKHggPDwgMTYpKSk+Pj4xNztcXG4gICAgICB9XFxuICBcXG4gICAgICBmdW5jdGlvbiBwdXNoVih0Z3QsIG4sIHN2KSB7ICB3aGlsZShuLS0hPTApIHRndC5wdXNoKDAsc3YpOyAgfVxcbiAgXFxuICAgICAgZm9yKHZhciBpPTA7IGk8MzI7IGkrKykgeyAgVS5sZGVmW2ldPShVLm9mMFtpXTw8Myl8VS5leGJbaV07ICBVLmRkZWZbaV09KFUuZGYwW2ldPDw0KXxVLmR4YltpXTsgIH1cXG4gIFxcbiAgICAgIHB1c2hWKFUuZmx0cmVlLCAxNDQsIDgpOyAgcHVzaFYoVS5mbHRyZWUsIDI1NS0xNDMsIDkpOyAgcHVzaFYoVS5mbHRyZWUsIDI3OS0yNTUsIDcpOyAgcHVzaFYoVS5mbHRyZWUsMjg3LTI3OSw4KTtcXG4gICAgICAvKlxcbiAgICAgICAgdmFyIGkgPSAwO1xcbiAgICAgICAgZm9yKDsgaTw9MTQzOyBpKyspIFUuZmx0cmVlLnB1c2goMCw4KTtcXG4gICAgICAgIGZvcig7IGk8PTI1NTsgaSsrKSBVLmZsdHJlZS5wdXNoKDAsOSk7XFxuICAgICAgICBmb3IoOyBpPD0yNzk7IGkrKykgVS5mbHRyZWUucHVzaCgwLDcpO1xcbiAgICAgICAgZm9yKDsgaTw9Mjg3OyBpKyspIFUuZmx0cmVlLnB1c2goMCw4KTtcXG4gICAgICAgICovXFxuICAgICAgVVpJUC5GLm1ha2VDb2RlcyhVLmZsdHJlZSwgOSk7XFxuICAgICAgVVpJUC5GLmNvZGVzMm1hcChVLmZsdHJlZSwgOSwgVS5mbG1hcCk7XFxuICAgICAgVVpJUC5GLnJldkNvZGVzIChVLmZsdHJlZSwgOSlcXG4gIFxcbiAgICAgIHB1c2hWKFUuZmR0cmVlLDMyLDUpO1xcbiAgICAgIC8vZm9yKGk9MDtpPDMyOyBpKyspIFUuZmR0cmVlLnB1c2goMCw1KTtcXG4gICAgICBVWklQLkYubWFrZUNvZGVzKFUuZmR0cmVlLCA1KTtcXG4gICAgICBVWklQLkYuY29kZXMybWFwKFUuZmR0cmVlLCA1LCBVLmZkbWFwKTtcXG4gICAgICBVWklQLkYucmV2Q29kZXMgKFUuZmR0cmVlLCA1KVxcbiAgXFxuICAgICAgcHVzaFYoVS5pdHJlZSwxOSwwKTsgIHB1c2hWKFUubHRyZWUsMjg2LDApOyAgcHVzaFYoVS5kdHJlZSwzMCwwKTsgIHB1c2hWKFUudHRyZWUsMzIwLDApO1xcbiAgICAgIC8qXFxuICAgICAgICBmb3IodmFyIGk9MDsgaTwgMTk7IGkrKykgVS5pdHJlZS5wdXNoKDAsMCk7XFxuICAgICAgICBmb3IodmFyIGk9MDsgaTwyODY7IGkrKykgVS5sdHJlZS5wdXNoKDAsMCk7XFxuICAgICAgICBmb3IodmFyIGk9MDsgaTwgMzA7IGkrKykgVS5kdHJlZS5wdXNoKDAsMCk7XFxuICAgICAgICBmb3IodmFyIGk9MDsgaTwzMjA7IGkrKykgVS50dHJlZS5wdXNoKDAsMCk7XFxuICAgICAgICAqL1xcbiAgICB9KSgpXFxuICAgIFwiKSl9ZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZXJTY3JpcHQoKXtyZXR1cm4gY3JlYXRlV29ya2VyKFwiXFxuICAgIGxldCBzY3JpcHRJbXBvcnRlZCA9IGZhbHNlXFxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIChlKSA9PiB7XFxuICAgICAgY29uc3QgeyBmaWxlLCBpZCwgaW1hZ2VDb21wcmVzc2lvbkxpYlVybCwgb3B0aW9ucyB9ID0gZS5kYXRhXFxuICAgICAgb3B0aW9ucy5vblByb2dyZXNzID0gKHByb2dyZXNzKSA9PiBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3MsIGlkIH0pXFxuICAgICAgdHJ5IHtcXG4gICAgICAgIGlmICghc2NyaXB0SW1wb3J0ZWQpIHtcXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1t3b3JrZXJdIGltcG9ydFNjcmlwdHMnLCBpbWFnZUNvbXByZXNzaW9uTGliVXJsKVxcbiAgICAgICAgICBzZWxmLmltcG9ydFNjcmlwdHMoaW1hZ2VDb21wcmVzc2lvbkxpYlVybClcXG4gICAgICAgICAgc2NyaXB0SW1wb3J0ZWQgPSB0cnVlXFxuICAgICAgICB9XFxuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3dvcmtlcl0gc2VsZicsIHNlbGYpXFxuICAgICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IGF3YWl0IGltYWdlQ29tcHJlc3Npb24oZmlsZSwgb3B0aW9ucylcXG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UoeyBmaWxlOiBjb21wcmVzc2VkRmlsZSwgaWQgfSlcXG4gICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdbd29ya2VyXSBlcnJvcicsIGUpXFxuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHsgZXJyb3I6IGUubWVzc2FnZSArICdcXFxcbicgKyBlLnN0YWNrLCBpZCB9KVxcbiAgICAgIH1cXG4gICAgfSlcXG4gIFwiKX1mdW5jdGlvbiBjb21wcmVzc09uV2ViV29ya2VyKGUscil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LGEpe3ZhciBpPWNudCs9MTtpbWFnZUNvbXByZXNzaW9uTGliVXJsfHwoaW1hZ2VDb21wcmVzc2lvbkxpYlVybD1nZW5lcmF0ZUxpYigpKSx3b3JrZXJ8fCh3b3JrZXI9Z2VuZXJhdGVXb3JrZXJTY3JpcHQoKSksd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsKGZ1bmN0aW9uIGhhbmRsZXIoZSl7aWYoZS5kYXRhLmlkPT09aSl7aWYodm9pZCAwIT09ZS5kYXRhLnByb2dyZXNzKXJldHVybiB2b2lkIHIub25Qcm9ncmVzcyhlLmRhdGEucHJvZ3Jlc3MpO3dvcmtlci5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLGhhbmRsZXIpLGUuZGF0YS5lcnJvciYmYShuZXcgRXJyb3IoZS5kYXRhLmVycm9yKSksdChlLmRhdGEuZmlsZSl9fSkpLHdvcmtlci5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixhKSx3b3JrZXIucG9zdE1lc3NhZ2Uoe2ZpbGU6ZSxpZDppLGltYWdlQ29tcHJlc3Npb25MaWJVcmw6aW1hZ2VDb21wcmVzc2lvbkxpYlVybCxvcHRpb25zOl9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LHIpLHt9LHtvblByb2dyZXNzOnZvaWQgMH0pfSl9KSl9ZnVuY3Rpb24gaW1hZ2VDb21wcmVzc2lvbihlLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxhKXt2YXIgaSxzLGMsbCx1LHA7aWYoaT1fb2JqZWN0U3ByZWFkMih7fSxyKSxjPTAsbD1pLm9uUHJvZ3Jlc3MsaS5tYXhTaXplTUI9aS5tYXhTaXplTUJ8fE51bWJlci5QT1NJVElWRV9JTkZJTklUWSx1PVwiYm9vbGVhblwiIT10eXBlb2YgaS51c2VXZWJXb3JrZXJ8fGkudXNlV2ViV29ya2VyLGRlbGV0ZSBpLnVzZVdlYldvcmtlcixpLm9uUHJvZ3Jlc3M9ZnVuY3Rpb24oZSl7Yz1lLFwiZnVuY3Rpb25cIj09dHlwZW9mIGwmJmwoYyl9LCEoZSBpbnN0YW5jZW9mIEJsb2J8fGUgaW5zdGFuY2VvZiBDdXN0b21GaWxlKSlyZXR1cm4gYShuZXcgRXJyb3IoXCJUaGUgZmlsZSBnaXZlbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQmxvYiBvciBGaWxlXCIpKTtpZighL15pbWFnZS8udGVzdChlLnR5cGUpKXJldHVybiBhKG5ldyBFcnJvcihcIlRoZSBmaWxlIGdpdmVuIGlzIG5vdCBhbiBpbWFnZVwiKSk7aWYocD1cInVuZGVmaW5lZFwiIT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSwhdXx8XCJmdW5jdGlvblwiIT10eXBlb2YgV29ya2VyfHxwKXJldHVybiBjb21wcmVzcyhlLGkpLnRoZW4oZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBzPWUsJElmXzMuY2FsbCh0aGlzKX1jYXRjaChlKXtyZXR1cm4gYShlKX19LmJpbmQodGhpcyksYSk7dmFyIGQ9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuICRJZl8zLmNhbGwodGhpcyl9Y2F0Y2goZSl7cmV0dXJuIGEoZSl9fS5iaW5kKHRoaXMpLGg9ZnVuY3Rpb24gJFRyeV8xX0NhdGNoKHIpe3RyeXtyZXR1cm4gY29tcHJlc3MoZSxpKS50aGVuKChmdW5jdGlvbihlKXt0cnl7cmV0dXJuIHM9ZSxkKCl9Y2F0Y2goZSl7cmV0dXJuIGEoZSl9fSksYSl9Y2F0Y2goZSl7cmV0dXJuIGEoZSl9fTt0cnl7cmV0dXJuIGNvbXByZXNzT25XZWJXb3JrZXIoZSxpKS50aGVuKChmdW5jdGlvbihlKXt0cnl7cmV0dXJuIHM9ZSxkKCl9Y2F0Y2goZSl7cmV0dXJuIGgoKX19KSxoKX1jYXRjaChlKXtoKCl9ZnVuY3Rpb24gJElmXzMoKXt0cnl7cy5uYW1lPWUubmFtZSxzLmxhc3RNb2RpZmllZD1lLmxhc3RNb2RpZmllZH1jYXRjaChlKXt9cmV0dXJuIHQocyl9fSkpfWltYWdlQ29tcHJlc3Npb24uZ2V0RGF0YVVybEZyb21GaWxlPWdldERhdGFVcmxGcm9tRmlsZSxpbWFnZUNvbXByZXNzaW9uLmdldEZpbGVmcm9tRGF0YVVybD1nZXRGaWxlZnJvbURhdGFVcmwsaW1hZ2VDb21wcmVzc2lvbi5sb2FkSW1hZ2U9bG9hZEltYWdlLGltYWdlQ29tcHJlc3Npb24uZHJhd0ltYWdlSW5DYW52YXM9ZHJhd0ltYWdlSW5DYW52YXMsaW1hZ2VDb21wcmVzc2lvbi5kcmF3RmlsZUluQ2FudmFzPWRyYXdGaWxlSW5DYW52YXMsaW1hZ2VDb21wcmVzc2lvbi5jYW52YXNUb0ZpbGU9Y2FudmFzVG9GaWxlLGltYWdlQ29tcHJlc3Npb24uZ2V0RXhpZk9yaWVudGF0aW9uPWdldEV4aWZPcmllbnRhdGlvbixpbWFnZUNvbXByZXNzaW9uLmhhbmRsZU1heFdpZHRoT3JIZWlnaHQ9aGFuZGxlTWF4V2lkdGhPckhlaWdodCxpbWFnZUNvbXByZXNzaW9uLmZvbGxvd0V4aWZPcmllbnRhdGlvbj1mb2xsb3dFeGlmT3JpZW50YXRpb24saW1hZ2VDb21wcmVzc2lvbi5jbGVhbnVwQ2FudmFzTWVtb3J5PWNsZWFudXBDYW52YXNNZW1vcnksaW1hZ2VDb21wcmVzc2lvbi5pc0F1dG9PcmllbnRhdGlvbkluQnJvd3Nlcj1pc0F1dG9PcmllbnRhdGlvbkluQnJvd3NlcixpbWFnZUNvbXByZXNzaW9uLmFwcHJveGltYXRlQmVsb3dNYXhpbXVtQ2FudmFzU2l6ZU9mQnJvd3Nlcj1hcHByb3hpbWF0ZUJlbG93TWF4aW11bUNhbnZhc1NpemVPZkJyb3dzZXIsaW1hZ2VDb21wcmVzc2lvbi5nZXRCcm93c2VyTmFtZT1nZXRCcm93c2VyTmFtZSxpbWFnZUNvbXByZXNzaW9uLnZlcnNpb249XCIxLjAuMTZcIjtleHBvcnR7aW1hZ2VDb21wcmVzc2lvbiBhcyBkZWZhdWx0fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJyb3dzZXItaW1hZ2UtY29tcHJlc3Npb24ubWpzLm1hcFxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/browser-image-compression/dist/browser-image-compression.mjs\n");
331
+
332
+ /***/ })
333
+
334
+ }]);